为什么splice()方法改变了其他数组的值?

时间:2012-04-17 08:37:16

标签: javascript arrays splice

我有一个数组说

var list = ["first", "second"];

现在我将列表分配给其他变量说

var temp = list;

现在我在列表上使用拼接,如

list.splice(0,1);

现在,当我检查列表的值时,它会显示

list = ["second"]

当我检查temp的值时,它会显示

temp = ["second"]

我想知道为什么会这样?为什么 temp 的值会发生变化?

4 个答案:

答案 0 :(得分:5)

当您执行var temp = list之类的作业时,您正在为temp创建引用list。因此,splice就地更改了list数组,您也在改变temp

使用slice而不是返回数组的副本,如此

var temp = list.slice();

答案 1 :(得分:1)

JS中常见的错误

这是一个指针,而不是对象的克隆:

var temp = list;

如果您想要实际复制对象,有几种方法。最简单的只是将其与自身联系起来:

var temp = list.concat([]);
// or
var temp = list.slice();

请注意,这有点危险,它只从数组中获取基值。有更多高级方法可用于克隆对象和创建“完美”数组克隆。

答案 2 :(得分:1)

slice

应该做的诀窍:

var temp = list.slice(0);

关于对象克隆,请查看How do you clone an Array of Objects in Javascript?

答案 3 :(得分:0)

您可以使用原型方法添加此功能。

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};

然后允许您这样做:

var a = [1,2,3];

var b = a.clone();

a[1] = 5;

console.log(a); //1,5,3
console.log(b); //1,2,3

免责声明:从这里无耻地借用(整篇文章值得一读):http://my.opera.com/GreyWyvern/blog/show.dml/1725165