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是表示对象的一种方式