繁体   English   中英

Javascript数组奇怪的行为

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM