2012-01-30 1 views
6

多少味付けされたJSデベロッパーでさえ、私は自分自身が常にオブジェクトの浅いコピーと深いコピーに驚いていることに気付いています。JavaScriptの値が値ではなく参照によってコピーされる場合の経験則はありますか?

JavaScriptの値が主要オブジェクトタイプの値ではなく参照によってコピーされる場合の経験則はありますか?たとえば、私は文字列の値が常に参照ではなく値によってコピーされることを知っています。

+0

あなたのコピー方法によって異なります。あなたは具体的にする必要があります - どのようにあなたの値をコピーしますか? –

+0

または、値が関数に引数として渡される場合を意味しましたか? –

+0

引数で渡されるのではなく、単純な 'var x、y; x = {'blah': 'foo'}; y = x; x = {'bar': 'bas'}; console.log(y); '状況のようなものですが、コピーの種類にニュアンスがある場合は、どうすれば問題を改善できるか教えてください。 – buley

答えて

4

JavaScriptでは、すべてのオブジェクトが保存され、「参照」によって渡されます。

var a = { v: 'a' }, b = { v: 'b' }; 
a=b; 
b.v='c'; 

abが同じオブジェクトを参照します。 a.v == 'c'およびb.v == 'c'

プリミティブデータ型(stringnumberbooleannull、及びundefined)は不変です。それらは価値によって渡されます。

var a = 'a', b = 'b'; 
a=b; 
b='c'; 

我々はプリミティブ、a == 'b'b == 'c'を扱っているので。


PedantsはJavaScriptが参照渡しされていないという古典的な意味であなたを教えてくれますか、それは「純粋な値渡し」言語だということが、私はそれが実用的な目的のために物事を複雑にすると思います。いいえ、関数に渡された引数を変数であるかのように直接変更することはできません(言語が渡されたときに真となります)。も受け取らない引数として渡されたオブジェクト(true-by-valueの場合)ほとんどの場合(言語ユーザーの観点から)、関数に渡されるオブジェクトは参照です。そのオブジェクトを変更することができ、呼び出し元のオブジェクトに影響します。 fantastic answers to this questionも参照してください。

2

OK、私はあなたのコードを説明しましょう:

var x, y; 
x = { 'blah': 'foo' }; 
y = x; 
x = { 'bar': 'bas' }; 

だから、あなたは2つの変数を宣言した後、あなたが最初の変数にオブジェクト値を割り当てます。

x = { 'blah': 'foo' }; 

だから、ここに何が起こりますか:

  1. オブジェクトリテラル - { ... } - が評価され、結果としてa新しいネイティブオブジェクト。
  2. このオブジェクトへの参照は、変数xに割り当てられます。

次に、このライン

y = x; 

単にコピー変数yxに格納される参照。これで、両方の変数は同じ参照をオブジェクトに格納します。

最後に、このライン

x = { 'bar': 'bas' }; 

可変xに新しい値を割り当てます。オブジェクトリテラルが評価され、オブジェクトの作成/初期化が行われ、オブジェクトが参照され、そのオブジェクトへの参照がxに格納されます。

ただし、変数yは、最初のオブジェクトへの参照を保持します。

関連する問題