- 深拷贝、浅拷贝的区别?
- 浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用
- 如果属性是基本类型,拷贝的就是基本类型的值。
- 如果属性是引用类型,拷贝的就是内存地址。
- 深拷贝:创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”
- 浅拷贝:将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用
如何实现深拷贝和浅拷贝?
浅拷贝:
- 对象:
Object.assign(target, source1, source2)
- 数组:
Array.prototype.concat()
Array.prototype.slice()
...
展开运算符
- 对象:
下面例子中,第一层数据
name
、age
是基本数据类型,因此不会改变而
msg
是对象,因此会发生改变
// 浅拷贝例子
// 第一层的基本数据类型不变,只有对象才变.
let obj1 = {
name: "Tom",
age: 18,
msg: {
code: 200,
},
};
let obj2 = Object.assign({}, obj1);
// let obj2 = {...obj1}
obj2.name = "John";
obj2.age = 20;
obj2.msg.code = 500;
console.log(obj1);
// {age: 18, name: 'Tom', msg: {code: 500}}
// ----- array 例子
let arr = [
1,
3,
{
username: "kobe",
},
];
let arr2 = arr.concat();
// let arr3 = arr.slice();
arr2[2].username = "wade";
console.log(arr); //[ 1, 3, { username: 'wade' } ]