Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript数组异常行为_Javascript_Arrays - Fatal编程技术网

Javascript数组异常行为

Javascript数组异常行为,javascript,arrays,Javascript,Arrays,好的,当你这样写的时候: var element = { "name": "" }; var array = []; for (var i = 0; i < 2; ++i) { var newelement = element; newelement.name = i.toString(); array[i] = newelement; } var元素={“name”:“}; var数组=[]; 对于(变量i=0;i

好的,当你这样写的时候:

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

var array = [];

for (var i = 0; i < 2; ++i) {
    var newelement = element;
    newelement.name = i.toString();
    array[i] = newelement;
}    
var元素={“name”:“};
var数组=[];
对于(变量i=0;i<2;++i){
var newelement=element;
newelement.name=i.toString();
数组[i]=新元素;
}    
结果为:数组[0]。名称==数组[1]。名称==“1”。 但是用另一种方式写:

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

var array = [];

for (var i = 0; i < 2; ++i) {
    var newelement = { "name": i.toString() };
    array[i] = newelement;
}
var元素={“name”:“};
var数组=[];
对于(变量i=0;i<2;++i){
var newelement={“name”:i.toString()};
数组[i]=新元素;
}
结果为:数组[0]。名称==“0”和数组[1]。名称==“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]
,因为它们都指向该对象

var newelement = element;   // just assigns a reference to an existing object
在第二个代码示例中,
array[0]
array[1]
都指向不同的对象,因此修改一个对象时,不会影响另一个对象


这是javascript中一个棘手的部分,并且经常会让C/C++程序员(在我第一次学习JS时,我当然是这样认为的)感到困惑,因为他们习惯于第一个赋值是一个结构副本。Javascript默认只分配一个引用,除非您使用的是专门创建新对象的语法。

ehhhh我真蠢。。。由于阅读了一些关于“不要在javascript中使用new”的文章,每个“=”都被翻译成“=new”。无论如何,谢谢你的回答~ json是表示对象的一种方式