千家信息网

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

发表于:2024-12-04 作者:千家信息网编辑
千家信息网最后更新 2024年12月04日,这篇文章主要介绍js中如何实现赋值、浅拷贝和深拷贝,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、js内存js内存,或者说大部分语言的内存都分为栈和堆。基本数据类型的变量值分
千家信息网最后更新 2024年12月04日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安全错误 数据库的锁怎样保障安全 公司网络安全宣传周方案 服务器ip设置超链接 app服务器端口不走怎么办 网络安全板块最新政策 网络安全基本要素是 软件开发商务人员岗位职责 计算机网络技术岗位认识 对计算机网络技术的认识 委外软件开发费要合同备案 数据库设计目的的体现是 安装数据库价格 不是数据库代理层带来的优势 什么类型服务器需要公网ip 网络安全下一步整改计划 指纹识别技术和数据库的区别 红外分析软件开发报价 做个软件连服务器一起多少钱 网络安全审计 审计局 即墨区安卓软件开发企业 数据库怎么查自己的表 微盘软件开发价格 怎么知道服务器是否是双通道 java读取数据库表的名字 系数运算的数据库软件 更新数据库c代码会自动更新吗 网信办的网络安全检查报告 数据库怎么连接到后端 小程序中如何修改数据库中的值 苹果有华为手机数据库吗 大规模服务器集群搭建的挑战
0