あなたのコードは、1 次元配列で問題なく動作します。
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] "関数内、変更後変更" [2, 17, 1, 5, 2, 3, 7, 2] "通話後" [2, 3, 1, 5, 2, 3, 7, 2]
それが 2D 配列であるという事実があなたを悩ませています。2D JavaScript 配列の複製に関するこのスタック オーバーフロー応答を確認してください。
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]] "関数内、変更後" [[2, 3], [1, 2], [3, 7, 2]] "呼び出し後" [[2, 3], [1, 5 、2]、[3、7、2]]