for循环中的值错误

时间:2013-10-25 01:56:06

标签: javascript loops

我在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]}时,它们都会返回我期望的正确值。

谁能告诉我那里有什么不同?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分: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分配一个新对象,以便每次都创建一个新对象并将其推入数组。

答案 2 :(得分:0)

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