博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深拷贝&浅拷贝
阅读量:7049 次
发布时间:2019-06-28

本文共 1171 字,大约阅读时间需要 3 分钟。

1、区别
浅拷贝:只拷贝了基本数据类型,引用数据类型只复制了引用,没有复制实体。
深拷贝:拷贝所有的层级属性

 

2、浅拷贝
(1) 直接赋值
拷贝之后,所有层级属性仍然公用了地址,会被影响
var a = [0, 1, [2,3], 4],b = a;a[0] = 1;a[2][0] = 1;console.log(a); // [1,1,[1,3],4]console.log(b); // [1,1,[1,3],4]

 

(2) slice 返回指定元素
第一层的属性确实深拷贝,拥有了独立的内存,但更深的属性却仍然公用了地址
var a = [0, 1, [2,3], 4],b = a.slice();a[0] = 1;a[2][0] = 1;console.log(a); // [1,1,[1,3],4]console.log(b); // [0,1,[1,3],4]

 

(3) contact 连接2个和多个数组
第一层的属性确实深拷贝,拥有了独立的内存,但更深的属性却仍然公用了地址
var a = [0, 1, [2,3], 4],var b = a.concat(4,5);a[0] = 1;a[2][0] = 1;console.log(a); // [1,1,[1,3],4]console.log(b); // [0,1,[1,3],4,5]

 

(4) object.assign 合并多个对象
第一层的属性确实深拷贝,拥有了独立的内存,但更深的属性却仍然公用了地址
var a = [0, 1, [2,3], 4],b = Object.assign([], a);a[0] = 1;a[2][0] = 1;console.log(a); // [1,1,[1,3],4]console.log(b);  // [0,1,[1,3],4]

 

(5) 对象扩展运算符 === Object.assign
第一层的属性确实深拷贝,拥有了独立的内存,但更深的属性却仍然公用了地址
var a = [0, 1, [2,3], 4],b = [...a];a[0] = 1;a[2][0] = 1;console.log(a); // [1,1,[1,3],4]console.log(b); // [0,1,[1,3],4]

 

3、深拷贝
(1) JSON方法(只能拷贝简单对象,对象里面包含函数无法拷贝)
JSON.parse(JSON.stringify(obj))

 

(2) for循环递归实现

 

(3) jquery可以$.extend(true, {}, obj)

 

(4)第三方函数lodash的_.cloneDeep

 

转载于:https://www.cnblogs.com/alisadream/p/10185119.html

你可能感兴趣的文章
ASP.NET中Session的个人浅谈
查看>>
数学图形之Kuen Surface
查看>>
统计图表类型选择应用总结&表数据挖掘方法及应用
查看>>
【故障处理】CRS-1153错误处理
查看>>
快来熟练使用 Mac 编程
查看>>
ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header
查看>>
MVC5 + EF6 简单示例
查看>>
Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
查看>>
ORACLE里锁有以下几种模式,v$locked_object,locked_mode
查看>>
【树莓派】Linux 测网速及树莓派源
查看>>
Java用户线程和守护线程
查看>>
[TypeScript] Use the never type to avoid code with dead ends using TypeScript
查看>>
Javascript 与 SPA单页Web富应用
查看>>
SpringMVC之访问静态文件
查看>>
【java设计模式】之 模板方法(Template Method)模式
查看>>
【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!...
查看>>
小米手机会不会更好
查看>>
atitit.Sealink2000国际海运信息管理系统
查看>>
android面试总结01 activity生命周期
查看>>
Java 实现策略(Strategy)模式
查看>>