该文章主要用于本身在平时学习记录使用javascript
主要是针对js中引用类型的复制。在引用类型中,定义的变量至关于一个指针,指向了某个对象或数组的引用java
let obj = {a: 1, b: 1};
let newObj = obj;
newObj.a = 2;
console.log(obj.a); // 2
复制代码
newObj
和obj
这两个变量都存储了指向对象的一个引用地址,实则共用一个对象,因此当改变newObj.a = 2
时,obj.a
也发生改变。这就是浅拷贝。数组
深拷贝就是让newObj.a
发送变化时,obj.a
不发生变化,newObj
和obj
至关于两个彻底不一样的对象。bash
slice()
或者concat()
或者ES6中的扩展运算符
(该方法也可用于一个对象)方法,可是该方法有个问题,当数组的元素也是一个引用类型时,则没法进行深层次的深拷贝。let arr = [1, 2, [3, 4], {a: 1, b: 2}];
let newArr = arr.slice(); //newArr -> [1, 2, [3, 4], {a: 1, b: 2}]
newArr[0] = 'change';
console.log(arr, newArr);
复制代码
能够发现:
newArr
经过slice()
方法复制了arr
,当改变newArr
第一层的元素时,arr
不受影响学习当改变深层的元素内容时,再来看一下效果:测试
能够发现:
newArr
和arr
的元素值都有变化ui经测试,
concat()
和ES6拓展运算符
与slice()
状况相同,有兴趣的童鞋能够本身试验下,童叟无欺!!!spa
最暴力、最直接的方式:JSON.parse(JSON.stringify(obj))
,可是该方法也有一些缺陷:3d
undefined
或 null
时:let arr = [undefined, 1, 2, 3, null];
console.log(JSON.parse(JSON.stringify(arr))); // [ null, 1, 2, 3, null ];
复制代码
其中undefined
被转为null
, null
依然为null
;指针
value
为undefined
或者 null
时:let obj = {a: 1, b: undefined, c: null, d: 'null', e: 'undefined'};
console.log(JSON.parse(JSON.stringify(obj))); // { a: 1, c: null, d: 'null', e: 'undefined' }
复制代码
其中value
为undefined
的属性被剔除,其他状况不变。