Javascript数组奇怪的行为

时间:2011-09-06 07:48:56

标签: javascript arrays

好的,写下如下:

var element = { "name": "" };

var array = [];

for (var i = 0; i < 2; ++i) {
    var newelement = element;
    newelement.name = i.toString();
    array[i] = newelement;
}    

结果:array [0] .name == array [1] .name ==“1”。 但是用另一种方式写作:

var element = { "name": "" };

var array = [];

for (var i = 0; i < 2; ++i) {
    var newelement = { "name": i.toString() };
    array[i] = newelement;
}

结果:array [0] .name ==“0”和array [1] .name ==“1”。

告诉我原因。

2 个答案:

答案 0 :(得分:6)

因为在第二个示例中,您是在每次迭代时创建一个新对象,但在第一个示例中,您始终引用相同的元素。

答案 1 :(得分:2)

这是一个很好的Javascript问题,供人们接触和理解。

在第一段代码中,您要为newelement分配element。每次循环时,newelement都会获得分配给它的相同引用。您没有创建任何新对象,只是一遍又一遍地分配相同的对象。

在第二个代码块中,您将在循环内创建一个新对象,以便每个赋值转到另一个对象。

您需要记住,在javascript中,将对象分配给变量只会分配对该对象的引用。

var newelement = element;   // just assigns a reference to an existing object

然而,像这样分配是创建一个新对象:

var newelement = { "name": i.toString() };   // creates a new object

因此,在第一个代码示例中,您有array[0]array[1],每个代码都引用同一个对象。修改该对象时,它会同时影响array[0]array[1],因为它们都指向该对象。

在第二个代码示例中,array[0]array[1]分别指向不同的对象,因此当您修改一个对象时,它不会影响另一个对象。

这是javascript的一个棘手的部分,并且经常绊倒C / C ++程序员(当我第一次学习JS时它确实得到了我),他们习惯于第一个任务是结构副本。除非您使用专门创建新对象的语法,否则Javascript默认只分配引用。