例如,我声明了一个对象,json
并在for循环中,我更改了json的值并将其推入list2中,但是它没有输出我期望的值。
var json = {
value: '',
text: '',
};
let list = [
{
a: 1,
b: 2,
c: 3
},
{
a: 4,
b: 5,
c: 6
}
];
let list2 = [];
for(i = 0; i < list.length; i++){
json.value = list[i].a;
json.text = list[i].b;
list2.push(json);
}
console.log(list2)
预期的输出是
list2 = [
{
value: 1,
text: 2,
},
{
value: 4,
text: 5,
}
];
但事实是:
list2 = [
{
value: 4,
text: 5,
},
{
value: 4,
text: 5,
}
];
为什么?
PS:我知道如何避免这个问题,但我不明白为什么会发生
Javascript具有按值传递的5种数据类型:布尔值,空值,未定义,字符串和数字。称为原始类型。
Javascript具有3种通过引用传递的数据类型:数组,函数和对象。
因此,在您的情况下,json
是一个对象,更改其值将反映为参照。
持有对象的变量不会“直接”持有对象。它持有的是对对象的引用。当您将该引用从一个变量分配给另一个变量时,就是在复制该引用。现在,两个变量都拥有对对象的引用。通过该引用修改对象会更改持有该对象引用的两个变量。
尽管您具有列表数组,但推送json会在其中推送其引用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句