即使我在函数内部使用克隆,嵌套数组也会更改。保留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);
答案 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]]