0

我在 for 循环中遇到问题

var a={ name:""};
var nameList=['jack','luck'];
var data=[];
for(var i=0;i<nameList.length;i++){
   a.name=nameList[i];
   data.push(a);
}
console.log(data) //output [Object { name="luck"}, Object { name="luck"}]

我想要的数据是 [Object { name="jack"}, Object { name="luck"}]。

当我在循环中更改代码时,它们都返回了我期望的正确值data.push({name:nameList[i]})data[i] = {name:nameList[i]}

谁能告诉我那里有什么区别?

4

3 回答 3

4

您只有一个对象,并且您反复更改其名称,并将对它的引用推送到数组中。这就是变量在 JavaScript 中的工作方式;复制是按值完成的,保存对象的变量的值是对该对象的引用

每次迭代都需要创建一个新对象。

for(var i=0;i<nameList.length;i++){
   a = { name: nameList[i] }
   data.push(a);
}
于 2013-10-25T01:57:46.893 回答
4

您将同一个对象一遍又一遍地推送到您的数组中,每次更改name属性时,您只是每次都在同一个对象上更改它。您每次都需要创建对象的新副本,因此每个副本都不同。您甚至可以在不使用这样的中间变量的情况下做到这一点:

var nameList = ['jack','luck'];
var data = [];
for(var i = 0; i < nameList.length; i++){
   data.push({name: nameList[i]});    // creates a new object each time thru the loop
}

或者,如果您想要中间对象(出于其他原因 - 您显示的代码不需要),它会像这样工作:

var nameList = ['jack','luck'];
var data = [], a;
for(var i = 0; i < nameList.length; i++){
   a = {};
   a.name = nameList[i];
   data.push(a);
}

请注意,a每次如何通过循环分配一个新对象,以便您每次都创建一个新对象并将其推入数组。

于 2013-10-25T01:58:19.677 回答
0

a在两个数组元素中都使用。这是同一个对象。第二次更改名称时,您将同时更改两者。

于 2013-10-25T01:59:17.853 回答