在ES6中新增了扩展运算符能够对数组和对象进行操做。有时候会遇到数组和对象的拷贝,可能会用到扩展运算符。那么这个扩展运算符究竟是深拷贝仍是浅拷贝呢?数组
一.、使用扩展运算符拷贝ide
首先是下面的代码。对象
let a = [1,2,3]; let b = [...a];
a == b // false
结果是false,这是很容易知道的,毕竟这个赋值操做符是有区别的。接下来将数组的值进行改变,又会怎样呢;it
let a = [1,2,3]; let b = [...a]; a[0] = 11; console.log(a); // [ 11, 2, 3 ] console.log(b); // [ 1, 2, 3 ]
发现a的值发生改变以后b的值并无发生改变。因此就是深拷贝了吗?别急,接下来将数组中的元素设为引用类型。console
let a = [1,2,[1,2,3]]; let b = [...a]; a[2][1] = 11; console.log(a); // [ 1, 2, [ 1, 11, 3 ] ] console.log(b); // [ 1, 2, [ 1, 11, 3 ] ]
console.log(a[2] === b[2]); // true
此次的结果就有意思了,若是改变数组中的引用类型的元素中的值,此时a和b的值都会改变,而且a和b中的引用类型全等,也就是说地址是相同的。那么为何是这样的呢?class
二.、缘由扩展
首先此分析仅为本人目前的认知。引用
对于数组中的扩展运算符只是一个浅拷贝,仅对引用类型数据的第一层进行了拷贝,而假若再深的层次就不会进行拷贝。im
另外对象的扩展运算符和数组是同样的。数据
let a = { name : "Jyy", msg : { age : 29 } } let b = {...a}; console.log(a == b); // false console.log(a.msg == b.msg); // true; a.msg = { age : "28" } console.log(a); // { name: 'Jyy', msg: { age: '28' } } console.log(b); // { name: 'Jyy', msg: { age: 29 } }
a.msg.age = 28
console.log(a); // { name: 'Jyy', msg: { age: 28 } } console.log(b); // { name: 'Jyy', msg: { age: 28 } }
在ES6中新增了扩展运算符能够对数组和对象进行操做。有时候会遇到数组和对象的拷贝,可能会用到扩展运算符。那么这个扩展运算符究竟是深拷贝仍是浅拷贝呢?
一.、使用扩展运算符拷贝
首先是下面的代码。
let a = [1,2,3]; let b = [...a];
a == b // false
结果是false,这是很容易知道的,毕竟这个赋值操做符是有区别的。接下来将数组的值进行改变,又会怎样呢;
let a = [1,2,3]; let b = [...a]; a[0] = 11; console.log(a); // [ 11, 2, 3 ] console.log(b); // [ 1, 2, 3 ]
发现a的值发生改变以后b的值并无发生改变。因此就是深拷贝了吗?别急,接下来将数组中的元素设为引用类型。
let a = [1,2,[1,2,3]]; let b = [...a]; a[2][1] = 11; console.log(a); // [ 1, 2, [ 1, 11, 3 ] ] console.log(b); // [ 1, 2, [ 1, 11, 3 ] ]
console.log(a[2] === b[2]); // true
此次的结果就有意思了,若是改变数组中的引用类型的元素中的值,此时a和b的值都会改变,而且a和b中的引用类型全等,也就是说地址是相同的。那么为何是这样的呢?
二.、缘由
首先此分析仅为本人目前的认知。
对于数组中的扩展运算符只是一个浅拷贝,仅对引用类型数据的第一层进行了拷贝,而假若再深的层次就不会进行拷贝。
另外对象的扩展运算符和数组是同样的。
let a = { name : "Jyy", msg : { age : 29 } } let b = {...a}; console.log(a == b); // false console.log(a.msg == b.msg); // true; a.msg = { age : "28" } console.log(a); // { name: 'Jyy', msg: { age: '28' } } console.log(b); // { name: 'Jyy', msg: { age: 29 } }
a.msg.age = 28
console.log(a); // { name: 'Jyy', msg: { age: 28 } } console.log(b); // { name: 'Jyy', msg: { age: 28 } }