保持原始数组完整,在功能中更改本地副本

时间:2013-07-29 15:04:50

标签: javascript pass-by-value

即使我在函数内部使用克隆,嵌套数组也会更改。保留a数组的最有效方法是什么? JSBin here

var a = [[2,3],[1,5,2],[3,7,2]];
function c(a) {
  var l = a.slice(0);
  console.log('in func, before change',l);
  l[1].splice(1,1);
  console.log('in func, after change',l);
}
console.log('before call', a);
c(a);
console.log('after call',a);

2 个答案:

答案 0 :(得分:0)

.slice没有做'深'复制。由于'a'的每个元素都是一个数组,iteslf,'a'的元素是对那些内部的,否则是匿名的元素的引用。

数组'l'包含引用的副本,复制的引用仍指向它们引用的相同“对象”。

答案 1 :(得分:0)

您的代码在一维数组上运行良好:

function c(a) {
  var l = a.slice(0);
  console.log('in func, before change',l);
  l[1] = 17;
  console.log('in func, after change',l);
}

var a = [2,3,1,5,2,3,7,2];
console.log('before call', a);
c(a);
console.log('after call',a);

输出:

“来电之前” [2,3,1,5,2,3,7,2] “在变化之前的功能” [2,3,1,5,2,3,7,2] “在func,改变后” [2,17,1,5,2,3,7,2] “电话结束后” [2,3,1,5,2,3,7,2]

事实上,它是一个二维阵列正在冲你。在克隆2D javascript数组时查看此堆栈溢出响应:

Multidimensional Array cloning using javascript

现在使用此代码:

Array.prototype.clone = function() {
    var arr = this.slice(0);
   for( var i = 0; i < this.length; i++ ) {
        if( this[i].clone ) {
            //recursion
            arr[i] = this[i].clone();
        }
    }
    return arr;
}

function c(a) {
  var l = a.clone();
  console.log('in func, before change',l);
  l[1].splice(1,1);
  console.log('in func, after change',l);
}

var a = [[2,3],[1,5,2],[3,7,2]];
console.log('before call', a);
c(a);
console.log('after call',a);

输出:

“来电之前” [[2,3],[1,5,2],[3,7,2]] “在变化之前的功能” [[2,3],[1,5,2],[3,7,2]] “在func,改变后” [[2,3],[1,2],[3,7,2]] “电话结束后” [[2,3],[1,5,2],[3,7,2]]