赋值、浅拷贝、深拷贝
最核心的区别
- 引用数据类型赋值是地址赋值,因此共享内存;
// 修改a和b中的x,都会影响对方
const a={x:1}
const b=a;
- 引用数据类型浅拷贝是开辟一块新的内存空间,而里面的数据如果是基本数据类型就直接复制,如果是引用数据类型就复制地址;
// 修改newArr[2].val能影响arr中的,说明引用类型是地址传递
// 修改newArr[1]并不会影响arr[1],说明基本数据类型是值传递
let arr = [1, 2, {val: 4}];
let newArr = arr.slice();
newArr[2].val = 1000;
console.log(arr); //[ 1, 2, { val: 1000 } ]
补充:浅拷贝的方法
- Object.assign(target,...source),只能用来拷贝对象;
- 扩展运算符:const a = { ...b },可以用来拷贝对象和数组;
- contact方法,可以用来拷贝数组;
let arr = [1, 2, 3,[4,5]]; let newArr = arr.concat();- 见上述示例,代码块中的是采用slice方法,也是用来拷贝数组。
- 引用数据类型深拷贝是开辟一块新的空间完全拷贝,源对象和拷贝对象是互不干扰的对象。
- 由对象A深拷贝出对象B,无论怎么修改B,都不会影响A,反之同理。