配列ele
を持っていて、別の配列arr
にele
のコピーを設定して、その配列を戻したいとします。私が持っているJavaScript関数は次のとおりです:JavaScript 2D配列の集団で予期しない出力が発生する
function foo(n) {
var arr = new Array(n);
var ele = [0,1];
for(var i=0;i<n;i++) {
arr[i] = ele;
}
return arr;
}
foo(3)
、私が望む出力は[[0,1],[0,1],[0,1]]
ですが、出力は[#1=[0, 1], #1#, #1#]
(Firefoxのウェブコンソールを使用)です。 [[0,1],[0,1],[0,1]]
:私が代わりにarr
直接[0,1]を取り込むときは、
function fooNew(n) {
var arr = new Array(n);
for(var i=0;i<n;i++) {
arr[i] = [0,1];
}
return arr;
}
のように私はfooNew(3)
の正しい出力を取得します。なぜ私の元の機能foo
は、fooNew
と同じ出力を出さないのですか?つまり、なぜarr
にele
を割り当ててarr[i]
に代入することができず、ele
の内容を直接arr[i]
に割り当てて、それを入力しなければならないのですか?
更新======:フェリックスクリングの役に立つ答えに照らして、そしていくつかのグーグルでの後、私はスライス(0)を使用することによって、あなたはARRにELEのコピーを置くことができることを見出した[I ]を参照してください。だから、FOOの次のような変形は、所望の出力が得られます:
function foo(n) {
var arr = new Array(n);
var ele = [0,1];
for(var i=0;i<n;i++) {
arr[i] = ele.slice(0);
}
return arr;
}
コメントとして、Firefox/FirebugとChromeの両方で正しく表示されます。最初の例では、SAMEの 'ele'配列への参照を' arr'のすべての位置に代入しています。だから 'x = foo(3); x [0] .push(2); '、x上のすべての配列は3つの要素を持ちます(実際には同じ配列なので) – julioolvr
私のために働きます。 Chromeでは、Firefox(Firebug)&Node.js @ julio.olvrは、 'ele'を割り当てるときには注意してください。'{}'オブジェクトのような配列は、コレクションへのポインタです。だから、 'var x = [1,2,3]'、 'var y = x'、そして' y [0] = 9'の場合、xは '[9,2,3]'になります。 – Marshall