拷贝,也可以理解为变量的复制。假设B复制了A,当A发生变化,B也跟着变化,这种称为浅拷贝;当A发生变化,B不发生变化,这种称为深拷贝。
基本数据类型的拷贝(深拷贝)
let a = 1
let b = a
b = 2
console.log(a) // 1 未发生变化
对象的拷贝(浅拷贝)
let A = { num: 1 }
let B = A
console.log(A === B) // true
B.num = 2
console.log(A) // { num: 2 } 发生变化
对象的拷贝(深拷贝)
let A = { num: 1 }
let B = JSON.parse(JSON.stringify(A))
console.log(A === B) // false
B.num = 2
console.log(A) // { num: 1 } 未发生变化
数组的拷贝(浅拷贝)
let a = [[1, 2]]
let b = a
console.log(b === a) // true
b[0][0] = 0
console.log(a) // [[0, 2]] 发生变化
// es6扩展运算符(...)只能深拷贝一维数组,对于二维以上的数组仍是浅拷贝
let a1 = [[1, 2]]
let b1 = [...a]
console.log(b1 === a1) // false
b1[0][0] = 0
console.log(a1) // [[0, 2]] 发生变化
数组的拷贝(深拷贝)
let a = [[1, 2]]
let b = JSON.parse(JSON.stringify(a))
console.log(a == b) // false
b[0][0] = 0
console.log(a) // [[1, 2]] 未发生变化
注意:数组拷贝 concat() 与 slice() 拷贝不彻底,都不是深拷贝(深拷贝是拷贝对象各个层级的属性,concat与slice都只能拷贝数组第一层数据)