3

我有一个数组说

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

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

var temp = list;

现在当我在列表上使用拼接时

list.splice(0,1);

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

list = ["second"]

另外,当我检查 temp 的值时,它会说

temp = ["second"]

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

4

4 回答 4

6

当您像var temp = list创建templist. 因此,由于就地splice更改list数组,您也在更改temp

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

var temp = list.slice();
于 2012-04-17T08:39:04.663 回答
1

JS中的一个常见错误

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

var temp = list;

如果要实际复制对象,有几种方法。最简单的就是将其与自身连接:

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

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

于 2012-04-17T08:42:18.367 回答
1

应该做的伎俩:

var temp = list.slice(0);

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

于 2012-04-17T08:42:56.110 回答
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

于 2012-04-17T08:48:37.650 回答