かなり自明問題... JavaScriptでアレイ上().push使用する場合、オブジェクトは関係なく、配列ポインタ(浅い)または実際のオブジェクト(深い)にタイプのを押し込まれます。オブジェクトはjavascriptの深いまたは浅いコピーで配列にプッシュされますか?
59
A
答えて
100
それはあなたがプッシュしているものに依存します。オブジェクトと配列は元のオブジェクトへのポインタとしてプッシュされます。数字やブール値などの組み込みプリミティブ型はコピーとしてプッシュされます。したがって、オブジェクトはどのような方法でもコピーされないので、それらのための深いまたは浅いコピーはありません。ここで
はそれを示し、作業の抜粋です:
var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};
// primitive value pushes a copy of the value 4
array.push(x); // push value of 4
x = 5; // change x to 5
console.log(array[0]); // array still contains 4 because it's a copy
// object reference pushes a reference
array.push(y); // put object y reference into the array
y.name = "foo"; // change y.name property
console.log(array[1].name); // logs changed value "foo" because it's a reference
30
jfriend00はここにマークを右ですが、一つの小さな明確化:あなたが何をあなたを変更することはできませんという意味ではありません変数が指し示しています。つまり、y
は、配列に入れた変数を最初に参照していますが、次に変数y
を取得し、配列内のオブジェクトから切断してを返します。参照)配列によってのみ参照されているオブジェクトを変更することなく、完全に別のものである。 `new`に "切断" オブジェクト参照を使用して約
http://jsfiddle.net/rufwork/5cNQr/6/
var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};
// 1.) pushes a copy
array.push(x);
x = 5;
document.write(array[0] + "<br>"); // alerts 4 because it's a copy
// 2.) pushes a reference
array.push(y);
y.name = "foo";
// 3.) Disconnects y and points it at a new object
y = {};
y.name = 'bar';
document.write(array[1].name + ' :: ' + y.name + "<br>");
// alerts "foo :: bar" because y was a reference, but then
// the reference was moved to a new object while the
// reference in the array stayed the same (referencing the
// original object)
// 4.) Uses y's original reference, stored in the array,
// to access the old object.
array[1].name = 'foobar';
document.write(array[1].name + "<br>");
// alerts "foobar" because you used the array to point to
// the object that was initially in y.
関連する問題
- 1. 配列の深いコピーまたは浅いコピーを複製しますか?
- 2. Javascriptスライスメソッドは深いコピーか浅いコピーを返しますか?
- 3. Scala AnyRef.cloneは、浅いコピーまたは深いコピーを実行しますか?
- 4. スライシング操作で深くまたは浅いコピーが得られますか?
- 5. キーを配列またはjavascriptオブジェクトにプッシュしますか?
- 6. 深い対浅いコピー、参照渡し
- 7. スライス割り当て、浅い/深いコピー
- 8. データ構造にデータを挿入するときに深いまたは浅いコピーがありますか?
- 9. Grailsで深いまたは浅いJSONシリアライゼーションを選択
- 10. SignalRがプッシュされたデータオブジェクトが浅い
- 11. Pythonでは、関数は浅いか深いコピーを返しますか? Pythonでは
- 12. 「浅い」と「深い」の違いは何ですか?
- 13. Javaのオブジェクトの深い(浅い)サイズのキャッシュを制限しますか?
- 14. Javascriptを深くネストされたオブジェクト/配列
- 15. JavaScriptコールバックは、値がループ内にプッシュされた配列です
- 16. オブジェクトのJavascriptプッシュ配列
- 17. 浅いクローニングと深いクローニング
- 18. 私は配列にプッシュすると、それはまた別の配列にプッシュ
- 19. ディープコピーは、浅いコピーが深いコピーが私の場合には動作しない理由
- 20. 浅いコピーが
- 21. javascriptオブジェクト配列は変更されていません
- 22. アーリーリストの浅いコピー
- 23. Javascriptで配列の配列がサポートされていますか?
- 24. Javersでの浅いコピー
- 25. オブジェクト内のjavascript配列に値をプッシュできません
- 26. Vuejsはネストされた配列にプッシュできません
- 27. JSONオブジェクトのクエリー文字列への深いJavascriptまたはjQueryの変換
- 28. コンストラクタをコピーする深さはどれくらいですか
- 29. ValueError: '目的の配列にあまりにも深いオブジェクト'
- 30. 値渡し/参照は深い/浅いコピーを作成するのと同等ですか?
興味深い点。 –
Downvoteの説明は?あなたが私にそれが何であるかを知らせなければ、問題を解決するのは難しいです。 – ruffin
なぜ私にpingしますか?私はずっと前にこれを打ち切り、あなたの答えが好きでした。ここで投票の画面は次のとおりです。http://i.imgur.com/AnDt98c.png –