带有数组元素的赋值是否复制或引用javascript中的元素?
我不确定用什么术语来寻找答案。鉴于:带有数组元素的赋值是否复制或引用javascript中的元素?,javascript,arrays,Javascript,Arrays,我不确定用什么术语来寻找答案。鉴于: this.snake = [{x: 0, y: 0}]; var curhead = this.snake[0]; curhead是否在snake[0]中包含字典(?)的副本或对它的直接引用?在您给出的示例中,curhead将包含对数组snake中第一项的引用,curhead将包含对数组中第一项的引用snakeJavaScript始终按值复制 JavaScript中的对象(包括数组)只能通过引用进行访问。(即,foo=[]生成一个数组,并将其引用分配给fo
this.snake = [{x: 0, y: 0}];
var curhead = this.snake[0];
curhead
是否在snake[0]
中包含字典(?)的副本或对它的直接引用?在您给出的示例中,curhead
将包含对数组snake中第一项的引用,curhead
将包含对数组中第一项的引用snake
JavaScript始终按值复制
JavaScript中的对象(包括数组)只能通过引用进行访问。(即,foo=[]
生成一个数组,并将其引用分配给foo
)
因此,您将获得数组中第一个值的副本,该值是对对象的引用
这与引用数组中的第一个值不同
鉴于:
var array = [ { value: 1 } ];
var reference = array[0];
array.unshift( { value: 2 } );
如果reference
是对数组中第一个值的引用,则通过更改第一个值,它将指向具有value:2
的对象
由于它是值的副本,因此它仍然是对值为1的对象的引用(现在是数组中的第二个值)。JavaScript始终按值复制
JavaScript中的对象(包括数组)只能通过引用进行访问。(即,foo=[]
生成一个数组,并将其引用分配给foo
)
因此,您将获得数组中第一个值的副本,该值是对对象的引用
这与引用数组中的第一个值不同
鉴于:
var array = [ { value: 1 } ];
var reference = array[0];
array.unshift( { value: 2 } );
如果reference
是对数组中第一个值的引用,则通过更改第一个值,它将指向具有value:2
的对象
由于它是值的副本,因此它仍然是对值为1的对象的引用(现在是数组中的第二个值)。它是一个只有一个元素的对象数组。所以
this.snake[0]
将包含对{x:0,y:0}的引用
第它是一个只有一个元素的对象数组。所以
this.snake[0]
将包含对{x:0,y:0}的引用
段落现在curHead
和snake[0]
指的是完全相同的内存位置。尝试更改curHead
中的值,它也会更改snake[0]
curhead.x = 1
console.log(curhead)
//Object {x: 1, y: 0}
console.log(this.snake)
//[{x: 1, y: 0}]
当你尝试将一个全新的对象分配给curhead
时,有趣的事情就会发生,比如说curhead='hi'
。然后javaScript将为curhead
和创建一个新的堆空间。snake
将保持其值{x:1,y:0}
现在curhead
和snake[0]
引用完全相同的内存位置。尝试更改curHead
中的值,它也会更改snake[0]
curhead.x = 1
console.log(curhead)
//Object {x: 1, y: 0}
console.log(this.snake)
//[{x: 1, y: 0}]
当你尝试将一个全新的对象分配给curhead
时,有趣的事情就会发生,比如说curhead='hi'
。然后javaScript将为curhead
和创建一个新的堆空间。snake
将保持其值{x:1,y:0}
curhead
将有一个引用。curhead
也将有一个引用。谢谢你的帮助!我也是。谢谢你的帮助!“到完全相同的内存位置”-这是一个实现细节。@sam如果答案有帮助,请单击upvote部分旁边的复选标记接受它。“到完全相同的内存位置”-这是一个实现细节。@sam如果答案有帮助,请单击upvote部分旁边的复选标记接受它。