[英]Javascript array weird behavior
好的,写的如下:
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”。
告诉我为什么。
因为在第二个示例中,您在每次迭代时创建一个新对象,但在第一个示例中,您始终引用相同的元素。
这是一个很好的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默认只分配引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.