使用数组元素赋值是否复制或引用javascript中的元素?

时间:2016-05-17 12:27:35

标签: javascript arrays

我不确定搜索答案的术语。给出:

this.snake = [{x: 0, y: 0}];
var curhead = this.snake[0];

curhead是否包含snake[0]字典(?)的副本或直接引用它?

4 个答案:

答案 0 :(得分:4)

JavaScript始终按值复制。

JavaScript中的对象(包括数组)只能通过引用访问。 (即foo = []生成一个数组并将其引用分配给foo)。

因此,您将获得数组中第一个值的副本,该副本是对象的引用。

这与对数组中第一个值的引用不同。

假设:

var array = [ { value: 1 } ];
var reference = array[0];
array.unshift( { value: 2 } );

如果reference是对数组中第一个值的引用,那么通过更改第一个值,它将指向具有value : 2的对象。

由于它是值的副本,因此它继续是value : 1对象的引用(现在是数组中的第二个值)。

答案 1 :(得分:0)

在您提供的示例中,curhead将包含引用到数组snake中的第一项

答案 2 :(得分:0)

它是一个只有一个元素的对象数组。所以

this.snake[0]

将包含对{x:0,y:0}的引用。

伞兵

答案 3 :(得分:-1)

现在curHeadsnake[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创建一个新的堆空间,this.snake将保持其值{x: 1, y: 0}不变