例如1:
let a = {a:'',b:''}
let arr = []
arr.push(a);
arr.push(a);
arr.forEach((item,index)=>{
item.id = index+1
})
console.log(arr)
以为返回的会是:
[{a:'',b:'',id:1},{a:'',b:'',id:2}]
实际上返回的是:
[{a:'',b:'',id:2},{a:'',b:'',id:2}]
例如2:
let a = {a:'',b:''}
let arr = []
arr.push(a);
arr.push(a);
arr[0].id = 1;
arr[1].id = 2;
console.log(arr)
以为返回的会是:
[{a:'',b:'',id:1},{a:'',b:'',id:2}]
实际上返回的是:
[{a:'',b:'',id:2},{a:'',b:'',id:2}]
这个原理是:因为Object对象是地址引用传递的,c对象在循环外声明时,每次a.push(c)添加的c都是同一个对象。就是说a[0],a[1],a[2]中存放的都是同一个对象的引用地址,在修改这个对象的属性后,所有存放这个对象引用的地方都会受到影响。
解决方案:就是把需要push的那个对象再包裹一层就ok;
let a = {a:'',b:''}
let arr = []
arr.push({c:a});
arr.push({{c:a}});
arr[0].id = 1;
arr[1].id = 2;
console.log(arr)
打印如下:
[
{id:1,c:{a:'',b:''}},
{id:2,c:{a:'',b:''}},
]