2016-11-05 6 views
6

これは古い質問かもしれませんが、私は実際にはjavascriptの割り当てとして参照によってオブジェクトをコピーする性質について興味があります。私はJavaScriptに新しいの一種だとハードコピー対シャローコピーjavascript

var a = {}; 
var b = a; 
a.name = "Renato"; 
console.log(b); 
Object {name: "renato"} 

場合、これは実際にオブジェクトの割り当てのデフォルトとしてシャローコピーを持っている私の注意を引いたことを意味

。ハードコピーを作成するには、ミックスインを作成する必要があります。私は変換が非常に暗黙的であるように見えるので、なぜこれがデフォルトとして選択されたのだろうと思っていました。ありがとう!

+0

なぜこれがデフォルトとして選択されたのか不思議です。ほとんどの場合、それは最良のオプションになるためです。JavascriptはGarbage Collected環境であり、その強みの1つはオブジェクトを渡すことができます。漏れ。もう一つの利点は速度です。 – Keith

+0

さらに、深いコピーはよりコストがかかります。デフォルトで浅いコピーを行うことで、プログラマは自由に実行したいものを自由に選択できます – Alex

答えて

11

オブジェクトと配列は、同じオブジェクトへの参照として扱われます。オブジェクトをクローンしたい場合、これを行うにはいくつかの方法があります。以降のブラウザで

、あなたが行うことができます:

var b = Object.assign({}, a); 

を使用すると、ライブラリのために行きたい場合は、lodashは_.cloneを提供(および_.cloneDeep):

var b = _.clone(a); 

あなたがしたくない場合これらのメソッドのどちらかを実行すると、各キーと値を列挙し、それらを新しいオブジェクトに割り当てることができます。

複数の関数などを渡すときに、参照として扱われることはしばしば価値があります。これは、数字や文字列などのプリミティブではそうではありません。ほとんどの場合、直感的ではないでしょう。

+0

良い古いJSON.parse/stringifyを追加することもできます。 'var b = JSON.parse(JSON.stringify(a))' – Keith

+0

@Keithもまた別のアイデアですが、機能を値として持つオブジェクトでは機能しません。 –

+0

もし '{a: 'b'、c:function(){}}'があれば、それを文字列にすると '' '' ':' b '}' "' ' –

関連する問題