千家信息网

js中如何实现赋值、浅拷贝和深拷贝

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,这篇文章主要介绍js中如何实现赋值、浅拷贝和深拷贝,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、js内存js内存,或者说大部分语言的内存都分为栈和堆。基本数据类型的变量值分
千家信息网最后更新 2024年11月30日js中如何实现赋值、浅拷贝和深拷贝

这篇文章主要介绍js中如何实现赋值、浅拷贝和深拷贝,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1、js内存

js内存,或者说大部分语言的内存都分为栈和堆。基本数据类型的变量值分配在栈上,引用数据类型的变量值分配在堆上,栈中只是存储具体堆中对象的地址。

2、赋值

对于基本数据类型,赋值操作是拷贝,即新旧变量不会相互影响。

var a = 1;var b = a;b = 2;console.log(b); // 2

对于引用数据类型,赋值操作只是在栈中新增一个指向堆中对象的变量,即复制引用地址。新旧变量之间会互相影响,即在新变量上改变对象值,旧变量对应值也会改变。

var a = {    name: "mike"};var b = a;b.name = "jack";console.log(a); // {name: "jack"}

3、浅拷贝

对于基本数据类型和不具有嵌套对象的数据,均是拷贝操作,新旧变量之间不会相互影响。

var a = {    name: "mike"};var b = {};b.name = a.name;b.name = "jack";console.log(a) // {name: "mike"}

但是对于具有嵌套对象的数据,浅拷贝只拷贝第一层对象,深层次的值仍然是复制引用地址。

var a = {    name: "mike",    language: {        first: "english",        second: "chinese"    }};var b = {};b.name = a.name;b.name = "jack";b.language = a.language;b.language.first = "japanese"console.log(a) // { language : {first: "japanese", second: "chinese"}}

js实现浅拷贝,思想:遍历target的每个属性,将起属性名和值赋值给新变量。
如果你明白了赋值的含义,那么在代码的第四行,当此时的target[key]的值是对象的时候,通过赋值赋予新变量,本质上是复制引用数据类型在堆中的地址,就不难理解为什么浅拷贝对于是否是嵌套对象的有不同结果了。

function shallowCopy(target) {    let result = {};    for (const key in target) {        result[key] = target[key];    }    return result;}

4、深拷贝

深拷贝是完完全全的拷贝,新旧变量之间不会相互影响。
对于参数是否是对象有不同的处理方法,如果是对象,对于对象的每个属性和值赋值然后递归处理; 否则直接返回。

function clone(target) {    if (typeof target === "object") {        //判断是否是数组        let result = Array.isArray(target)? [] : {};        for (const key in target) {            result[key] = clone(target[key]);        }        return  result;    } else {        return target;    }}

以上是"js中如何实现赋值、浅拷贝和深拷贝"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

拷贝 对象 变量 数据 类型 地址 新旧 影响 之间 内存 属性 不同 内容 只是 篇文章 量值 分配 处理 代码 价值 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳市天麒软件开发有限公司 自由独立型网络安全员职业定位 张艺兴网络安全手指舞 计算机网络技术行业分析小结 我的世界服务器多世界插件 互联网科技对生活的影响 如何取消数据库捆绑方案 电脑服务器不能连接网络 i7加速器服务器官网注册 青浦区品牌软件开发定制要多少钱 浏览器与服务器之间传输 服务器安全组怎么设置密码 网络安全分配基本原则 以太坊服务器的算力 学籍管理系统数据库设计说明书 白水县网络安全和信息化 各大服务器地址大全 数据库取字符串后3位 如何删除excel数据库 长沙服务器维修电话 苏州硬件led大屏服务器 浙江电视墙服务器供应商 计算应用及软件开发哪个好 2021赎金最高网络安全事件 微信公众号服务器设置 静安区常规软件开发参考价格 广州万马互联网科技有限公司 腾讯软件开发管理软件 微信数据中心服务器多大 软件开发部经理待遇
0