11

重複の可能性:
javascriptの値による配列のコピー

javascriptに面白い問題があります。配列変数をコピーしてコピーのみを変更してから、コピーをスプライスして要素を削除します。ただし、元の配列変数はスプライスの影響を受けます-コピーが「参照によるコピー」であるかのように:

window.onload = function() {
  var initial_variable = ['first', 'second', 'third'];
  var copy_initial_variable = initial_variable;
  copy_initial_variable.splice(0, 1);
  alert('initial variable - ' + initial_variable);
};
//output: initial variable - second,third

まず、これはjavascriptの意図的な動作ですか、それともバグですか?

次に、配列のコピーを作成し、コピー内の要素を削除して、元の要素を削除するにはどうすればよいですか?

上記がjavascriptのバグである可能性があると私に思わせる1つのことは、この動作は配列でのみ発生し、整数では発生しないということです。例えば:

window.onload = function() {
  var initial_variable = 1;
  var copy_initial_variable = initial_variable;
  copy_initial_variable = 2;
  alert('initial variable - ' + initial_variable);
};
//output: initial variable - 1

2動作が一貫している場合、割り当てはおそらく参照によるものであるため、これを出力する必要がありますか?

4

3 に答える 3

14

これは決してバグではありませんが、非常に一般的な誤解です。私が言うとどうなるか見てみましょう

var a = b;

整数およびfloatやbooleansなどの他のjavascriptプリミティブは、「値によって割り当てられます」。つまり、bの値はすべてaにコピーされます。コンピュータにとっては、bが参照するメモリの一部を参照するメモリにコピーすることを意味ます。それはあなたが期待していた振る舞いです。

配列やその他のオブジェクト(およびnew Object()呼び出しの「子孫」)がそのように使用される場合、参照によるコピーがあります。aの値がbの値を参照するようになったということは、 bが参照するメモリが コピーまたは変更されないことを意味します。したがって、書くとき

a = [1,2,3];
b = a;

baは交換可能になります。それらは同じメモリアドレスを参照しています。あなたがやろうとしていることを達成するために、

var copy_initial_variable = initial_variable.slice(0);

読むJavaScriptは参照によって渡されますか?詳細については。

于 2013-01-05T09:05:37.550 に答える
4

最初のケースでは、参照によって渡される配列を使用しています。そして2番目のケースでは、値によって渡されるプライムタイプを使用しています。最初のケースでは、初期配列をコピーする必要があります(例:)initial_variable.slice(0)。次のようなものを試してください

window.onload = function() {
  var initial_variable = ['first', 'second', 'third'];
  var copy_initial_variable = initial_variable.slice(0); //returns new array!!!!
  copy_initial_variable.splice(0, 1);
  alert('initial variable - ' + initial_variable);
};
于 2013-01-05T09:01:10.460 に答える
0

問題は動作の仕方ではなく、同じ配列を参照しspliceているという事実です。initial_variablecopy_initial_variable

alert (copy_initial_variable === initial_variable);

JavaScriptには、数値やブール値などのプリミティブ値と、配列を含むオブジェクトの2種類の値があります。変数はプリミティブ値を保持しますが、オブジェクトへの参照を保持します。プリミティブ値の「コピー」は期待どおりに機能しますcopy。変数を変更しても元の変数が変更されないように、新しいプリミティブ値が作成されます。ただし、オブジェクトを「コピー」すると、実際にはそのオブジェクトを指す参照がコピーされ、新しいオブジェクトは作成されません。

これはJavaScriptのバグではなく、意図した動作です。

于 2013-01-05T08:55:42.513 に答える