浅拷贝的认识
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都属于浅拷贝。
