如何将多个对象添加到数组中

4
为什么a[0].nil的值是400?我该怎么做才能将其设置为200?谢谢回答。
a = new Array();
x = new Object();
str = "nil";

x[str] = 200;

a.push(x);

x[str] = 400;

a.push(x);

alert("1 = "+ a[0].nil);
alert("2 = "+ a[1].nil);
3个回答

3
因为你将对象 x 的引用推入数组 a,而不是该对象的副本。
修改 x[str] 的值后,a[0] 引用指向更新后的对象。
因此,在你的代码中,a[0]a[1]x 都指向同一个对象。如果你希望在代码执行的特定时刻添加 x 对象的副本,则必须克隆你的对象 x 并将其推入数组中。
SO 问题 “如何正确克隆 JavaScript 对象?” 将帮助你克隆 js 对象。另请参阅文章“JavaScript:按值传递还是按引用传递”,以更好地了解 javascript 中的变量传递。
祝你好运!

1

为什么a[0].nil的值是400

因为x仍然指向你没有改变的旧引用(你只改变了其中的属性值)。

我应该怎么做才能将它设置为200

在修改属性值之前,简单地执行

x[str] = 400;

添加这一行

x = {}; //x = new Object();

@AhmadBudiU 很高兴能帮到你。请接受并点赞那个对你有帮助的答案。http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work - gurvinder372

0

你应该使用Object.assign克隆对象

Object.assign()方法用于将一个或多个源对象的所有可枚举自有属性的值复制到目标对象中。它将返回目标对象。

a = new Array();
x = new Object();
str = "nil";

x[str] = 200;

a.push(Object.assign({}, x));

x[str] = 400;

a.push(Object.assign({}, x));

document.write("1 = "+ a[0].nil);
document.write("2 = "+ a[1].nil);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接