2017-08-21 12 views
-2

私は何年もJavaScriptを使用してきましたが、これは私を困惑させています。私は物事を理解できるようにvarを定義する際に、2つのうちの1つが発生します:式は原始的であるJavaScriptのプリミティブとオブジェクトの参照

  1. 場合、varは、渡された式を参照せずにそのプリミティブの新しいインスタンスとして定義されています。
  2. 式がオブジェクトリテラルの場合、新しいオブジェクトが作成されます。
  3. 表現が既存のオブジェクトである場合、varはオブジェクトを参照し、オブジェクトに対する将来の変更は反映されます。 refobjbodyプロパティとして定義されているので、私も文字列としてrefをだろうと思っ再定義

    var obj = {body: {'a': 1, 'b': 2, 'c': 3}}; 
    
    var ref = obj.body; 
    ref = JSON.stringify(ref); 
    
    console.log(typeof ref); // string 
    console.log(typeof obj.body); // object 
    

    :しかし、私はケース3が適用されないような状況に遭遇しました

影響を受けるのはobj.bodyです。それで私は何が欠けているのですか?

+1

あなたは変数を上書きしますが、オブジェクトにあるものを変更するつもりはありません.... – epascarello

+0

「ref = ...」が指しているオブジェクトを変更しないという混乱が生じると思います。 'ref'を変更した場合(例えば、' ref.a = 5'を設定することによって)、両方の参照を介して更新が表示されます。 – Phylogenesis

答えて

0

プリミティブは不変です。オブジェクトと比較してどのように動作するかに違いがある場合は、そのことを知ることはできません。したがって、コピーに関するすべてのことを忘れてしまいます。代わりに "物事"の面で話しましょう!オブジェクトとプリミティブは両方とも物事です。変数に物を割り当てると、その物をコピーしていません。

var x = literally any value; 
var y = x; 

xyは同じものが含まれて両方の変数です。それを変更すると、将来どこからアクセスするかは関係ありません。物事が変わった。変数に含まれるものを変更した場合、前に含まれていたものは影響を受けません。

var z = some other value; 
y = z; // y now contains the same thing as z instead of the same thing as x 
     // only variables changed, and the things did not 

これについては他にも多くの回答がありますが、技術的な知識があります。

tl; dr:JavaScriptのオブジェクトとプリミティブの区別は、すべての目的と目的のために有用ではありません。

ts; iwrseThis article about Pythonは、JavaScriptにも同様に適用されます。

+0

長い形式のコメントftw – Ryan

2

JSON.stringifyは、オブジェクトを取得してその文字列表現を返すメソッドです。何も変更されません。 ref = xを実行すると、refは別のものを指し示しますが、割り当て前に何があったかには影響しません。

+0

私はまだ混乱しています。'ref'が' obj.body'を参照してから 'ref = 'foo''を実行した場合、' obj.body'は 'foo'として再定義されませんか? – Cliff

+1

@Cliff 'ref = 'abc''を実行すると、完全に新しいオブジェクトを参照するようになります。 –

+0

@Cliff答えを受け入れることを検討してください –

0

これは単に、obj.body .bodyを参照しておらず、他のものを参照しているということを意味します。

var ref = obj.body; 

//ref holding obj.body now any changes to ref will effect obj.body. 

ref = JSON.stringify(ref); 

//ref holding a String returned by `stringify()` now any changes to ref will effect obj.body. 

異なる値でrefを変更するだけです。実際に何も変更していないobj

関連する問題