ES6中数组和对象的扩展运算符拷贝问题以及经常使用的深浅拷贝方法

 

  在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 } }
相关文章
相关标签/搜索