2012-04-17 79 views
2

我有一个数组说为什么splice()方法改变其他数组的值?

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

现在我给你列表其他一些变量说

var temp = list; 

现在,当我使用拼接名单

list.splice(0,1); 

现在,当我检查它显示的清单的值

list = ["second"] 

而且当我检查温度的值,那么它说

temp = ["second"] 

我想知道为什么会这样呢?为什么temp的值改变了?

+0

因为'temp'只是一个* *指向实际数组的指针,它不被复制。 – 2012-04-17 08:38:42

+0

[为什么在JavaScript中更改数组会影响数组的副本?](http://stackoverflow.com/questions/6612385/why-does-changing-an-array-in-javascript-affect-copies-of-the-array) – 2012-04-17 08:39:46

回答

3

当使用var temp = list时,您正在创建参考templist。如此以来,splice改变list阵列原地的,你也改变temp

使用slice代替它返回数组的副本,像这样

var temp = list.slice(); 
+0

那么我该如何克服这个问题呢? – 2012-04-17 08:40:37

+0

请参阅我的编辑并使用slice()方法 – fcalderan 2012-04-17 08:42:44

1

在JS

这一个常见的错误是一个指针,不是对象的克隆:

var temp = list; 

如果你想要实际上对象,有几种方法。最简单的方法就是连接它自己:

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

请注意,这有点危险,它只会从数组中获取基本值。还有更多先进的克隆对象和创建'完美'数组克隆的方法。

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

相关问题