JavaScript Reference数组插入

时间:2013-11-29 14:18:54

标签: javascript

我是JavaScript的新手,但我知道JavaScript在传递对象时传递基元和通过引用调用时会按值调用。

var a = [4,5];
var temp = a;
console.log(a);    // [4,5]       OK
console.log(temp); // [4,5]       OK
temp = temp.push(6);  // Insert one more element into temp array

console.log(a);     // [4,5,6]  why so??
Console.log(temp);  // [4,5,6]  

我知道这是因为参考变了。我该怎么做才能避免深层复制?

如果我改变temp不想改变原始参考a,则应打印[4,5]。

3 个答案:

答案 0 :(得分:4)

如果要复制它,可以使用slice:

var temp = a.slice(0);

编辑:感谢cuberto指出我切片(0)

答案 1 :(得分:2)

  

“我知道JavaScript行为是按原始价值和价值调用的   在对象的情况下通过引用调用。“

不完全是。在Javascript中,所有内容都始终按值传递。如果传递一个对象,则实际传递对该对象的引用,该引用按值传递。

示例:

var o = { name: 'first' };

// pass object reference to a function
use(o);

function use(x) {
  // change the reference
  x = { name: 'second' };
}

alert(o.name); // shows "first"

当引用按值传递给函数时,更改函数内部的引用不会更改用于发送引用的变量。

在您的代码中,您只有一个数组:

var temp = a; // copy the reference from a to temp

您有两个引用相同数组的变量,因此当您使用另一个变量查看数组时,使用一个变量访问数组所做的任何更改都将可见。

要获得两个独立的数组,您必须专门创建它的副本:

var temp = a.slice(0);

注意:复制数组会产生浅表副本。这意味着,如果你有一个你复制的对象数组,你将有两个数组,但它们仍将共享同一组对象。

答案 2 :(得分:0)

如您所知,原始值按值传递,其他所有值都通过引用传递。基元是布尔值,数字和字符串(这里可能考虑nullundefined)。其他一切都是一个对象,并通过引用传递。