带有数组元素的赋值是否复制或引用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部分旁边的复选标记接受它。