赋值、浅拷贝、深拷贝的区别

136 阅读1分钟

赋值、浅拷贝、深拷贝

最核心的区别

  1. 引用数据类型赋值是地址赋值,因此共享内存;
// 修改a和b中的x,都会影响对方
const a={x:1}
const b=a;
  1. 引用数据类型浅拷贝开辟一块新的内存空间,而里面的数据如果是基本数据类型就直接复制,如果是引用数据类型就复制地址
// 修改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 } ]

补充:浅拷贝的方法

  1. Object.assign(target,...source),只能用来拷贝对象;
  2. 扩展运算符:const a = { ...b },可以用来拷贝对象和数组;
  3. contact方法,可以用来拷贝数组;
    let arr = [1, 2, 3,[4,5]]; let newArr = arr.concat();
  4. 见上述示例,代码块中的是采用slice方法,也是用来拷贝数组。
  1. 引用数据类型深拷贝开辟一块新的空间完全拷贝,源对象和拷贝对象是互不干扰的对象。
  • 由对象A深拷贝出对象B,无论怎么修改B,都不会影响A,反之同理。