好的,写下如下:
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”。
告诉我原因。
答案 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默认只分配引用。