浅拷贝的认识

2021-03-11  本文已影响0人  嗳湫

第一种定义:一个新的对象直接拷贝已存在的对象的引用,即浅拷贝。

第二种定义:一个新的对象直接拷贝已存在的对象的对象属性的引用,即浅拷贝。

第一种和第二种的差异即是,对象本身引入与对象的对象属性的引入,因为我没有找到标准的关于浅拷贝的官方定义,所以对于这两种方式便开始思考想办法去验证。

Array.prototype.slice()属于浅拷贝,那我们来验证一下Array.prototype.slice()返回的新数组对象和老的数组对象之间究竟符合那种关系

var a = [ 1, 3, 5, { x: 1 } ];  
var b = Array.prototype.slice.call(a);  
b[0] = 2;   
console.log(a); // [ 1, 3, 5, { x: 1 } ];   
console.log(b); // [ 2, 3, 5, { x: 1 } ];

很明显,属于浅拷贝的a和b并不是第一种定义所描述的,如果a和b是相同的引用对象,当b[0]改变时a[0]应当是跟着改变。

var a = [ 1, 3, 5, { x: 1 } ];  
var b = Array.prototype.slice.call(a);  
b[3].x = 2; 
console.log(a); // [ 1, 3, 5, { x: 2 } ];   
console.log(b); // [ 1, 3, 5, { x: 2 } ];

通过上面的代码既可以看出,浅拷贝的正确定义是第二种,只拷贝已存在对象的对象属性的引用,其余非对象属性是占用新的内存空间,并非与原对象共享。

浅拷贝:新的对象复制已有对象中非对象属性的值和对象属性的引用。
像常用的数组方法slice和对象方法Object.assign都属于浅拷贝。


image.png
上一篇 下一篇

猜你喜欢

热点阅读