Javascript ES5 unshift / push改变原始Array而不是内部Array

时间:2018-03-16 12:14:53

标签: javascript arrays

我写了一个简短的Codepen,我试图改变一个临时数组,同时保留原来的数组,但我的两个数组都被改变了。

有人可以解释我的问题是什么吗?

var x = ["x"];
abc(x);

function abc(x){
  for(var i = 0; i < 3; i++) {
    var y = x;
    y.unshift("y");
    console.log(y);
    console.log(x);
  }
}

输出:

["y", "x"]
["y", "x"]
["y", "y", "x"]
["y", "y", "x"]
["y", "y", "y", "x"]
["y", "y", "y", "x"]

提前致谢。

2 个答案:

答案 0 :(得分:1)

没有内部数组。内存中只有一个数组对象。 xy只是对单个数组实例具有相同引用的不同变量,因为您已将x的值分配给y,这是一个参考而那个引用只是被复制了。

如果您想使用数组副本,可以使用slice函数。

var x = ["x"];
abc(x);

function abc(x) {

  var y = x.slice();

  for(var i = 0; i < 3; i++) {
    y.unshift("y");
    console.log('Array y: ' + y);
    console.log('Array x: ' + x);
  }
  
}

答案 1 :(得分:0)

Javascript通过引用处理对象。因此,如果您编写var y = x,它不会复制您的对象,而是复制参考。因此,当您更新y时,它会同时更新x

如果要复制对象,可以执行以下操作:

var y = JSON.parse(JSON.stringify(x))