2

我在我的代码中遇到了一个奇怪的错误,我无法理解它为什么会发生。

我有一个数组array1。我通过使array2 等于array1 来复制array1。然后我使用 splice 修改 array2 以添加一个数字。Array1不应该被触及?但两者都输出相同的变化。

var array1 = [0,1,2,3,4,5];
var array2 = array1;
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

我假设我混淆了数组分配?在不发生这种情况的情况下复制数组的正确方法是什么?

干杯

4

3 回答 3

4

用于array1.concat()复制数组而不是传递对 的引用array1

var array1 = [0,1,2,3,4,5];
var array2 = array1.concat();
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

array.concat()可以连接多个数组,但如果你传递一个空参数,你实际上是在连接一个没有任何内容的数组:克隆数组。

请注意,任何数组和对象元素仍然是引用:

var a = [ [1], 2];
var b = a.concat();
b[0][0] = 0;
console.log(b); // gives 0,2
console.log(c); // gives 0,2 too!
于 2011-08-18T17:20:52.533 回答
0

如果你使用 jQuery,你可以这样做:

var array1 = [0,1,2,3,4,5];
var array2 = array1.slice();
array2.splice(1,0,1) //add  
console.log(array1);
console.log(array2);

看看这个例子

于 2011-08-18T17:22:57.173 回答
-1

数组和对象是通过引用复制的。试试这个:

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 array1 = [0,1,2,3,4,5];
var array2 = array1.clone();
于 2011-08-18T17:20:51.953 回答