var obj1 = {a:1}
var obj2 = obj1
obj2.a = 10
console.log(obj1) // {a:10}
console.log(obj2) // {a:10}
这个时候因为浅拷贝的问题,两个栈数据都指向同一个堆块数据,所以obj1和obj2的值就算修改其中一个也还是一样的
解决方法有两种:
第一种方法(利用JSON转换,先将数据转换为String型(简单数据类型(也可以说是一般数据类型)),再转换为复杂数据类型(也可以说是引用数据类型)):
var obj1 = {a:1}
var obj2 = JSON.parse(JSON.stringify(obj1))
obj2.a = 10
console.log(obj1); // {a:1}
console.log(obj2); // {a:10}
第二种方法(不推荐使用,利用扩展运算符(...)将数据展开,再赋值):
var obj1 = {a:1}
var obj2 = {...obj1}
obj2.a = 10
console.log(obj1) // {a:1}
console.log(obj2) // {a:10}
不推荐使用是因为扩展运算符展开数据,只能展开第一层的,其他层级不会再进行展开,如果数据是:
var obj1 = {
a:1,
b:{
c:{
d:5
}
}
}
var obj2 = {...obj1}
obj2.b.c.d = 10
console.log(obj1); // {a: 1, b: {…}} //d: 10
console.log(obj2); // {a: 1, b: {…}} //d: 10
就无法解决了!