2017-01-19 11 views
0

私は非常にスクリプトで何が起こっているのかについては特定できません。 javascripitのプロパティの変更を理解するために、このスクリプトを書きました。変数ctxがあり、2つのプロパティctx.exportsctx.module.exportsがあります。以下のint ehコードを見ることができるので、私は関係 を確立したので、ctx.exportsが変更されたときに同じ値を保持します。ctx.module.exports しかし、以下のスクリプトは別の方法を提案します。このスクリプトでは何が起こっているのですか

var ctx = {}; 
 
ctx.exports = {}; 
 
ctx.module = { 
 
    exports: ctx.exports 
 
} 
 

 
ctx.exports = { 
 
    h: "hello" 
 
} 
 

 

 
if (ctx.exports == ctx.module.exports) { 
 
    console.log("hi"); 
 
} else { 
 
    console.log("hey"); 
 
}

しかし、私はここではローカル変数exportsctx.exports値を格納します。 exportsは誰CN ctx.exports

var ctx = {}; 
 
ctx.exports = {}; 
 
ctx.module = { 
 
    exports: ctx.exports 
 
} 
 

 
var exports = ctx.exports; 
 
ctx.exports = { 
 
    h: "hello" 
 
} 
 

 

 
if (exports == ctx.module.exports) { 
 
    console.log("hi"); 
 
} else { 
 
    console.log("hey"); 
 
}

の修正にctx.module.exportsと等しくなる。この場合には何が起こっているかを私に説明?これはJavaスクリプトのスコープの一種です。これは正しい名前を持っていますか? ctx.module.exportsは、それが一致している理由です{}に対してチェックされる最初の答えによってexpllainedよう

編集

。しかし、その場合には、なぜこの失敗

var ctx = {}; 
 
ctx.exports = {}; 
 
ctx.module = { 
 
    exports: ctx.exports 
 
} 
 

 
var exports = ctx.exports; 
 
ctx.exports = { 
 
    h: "hello" 
 
} 
 

 
if ({} == ctx.module.exports) { 
 
    console.log("hi"); 
 
} else { 
 
    console.log("hey"); 
 
}

答えて

1

が比較されているものを見てくださいです。最初の例では、ctx.module.exportsを参照番号ctx.exportsに設定しました。空のオブジェクトは{}です。次に、ctx.exportsを新しい値:{ h: "hello" }で上書きしました。 ctx.module.exportsは元のオブジェクトへの参照を保持していましたが、ctx.exportsは異なるオブジェクトを参照していました。{}{ h: "hello" }を比較しています。

2番目の例では、再度新しいオブジェクトとctx.exportsを上書きしているが、あなたは、元のオブジェクトへの2つの参照と比較されています{}{}にします。それはマッチです。

EDIT - もう少し明快に 変数の値を設定すると、名前を参照にリンクしています。その変数を上書きすると、同じ名前の新しい参照が作成されますが、参照は変更されません。そのため、ctx.exportsの上書きは他の参照に影響しません。

質問の編集への編集 このようなオブジェクトは比較できません。 {} !== {}それぞれのオブジェクトリテラル宣言が新しいObjectインスタンスを作成するためです。参照が比較できる理由は、同じオブジェクト、つまりctx.exports = {}によって作成されたオブジェクトへの参照であるためです。

詳細編集! これは、各オブジェクトのJSON値を比較することによって実際に確認できます。JSON.stringify({}) == JSON.stringify(ctx.module.exports)は、同じ文字列を比較しているため真です。 {} == ctx.module.exportsは、異なるオブジェクトを比較しているため、偽です。

+0

を私が編集を掲載しています。これをチェックしてください –

1

私はあなたの問題は比較ではなく、割り当てではないと思う。

ctx.module = { 
    exports: ctx.exports 
} 

オブジェクト自体が複製されていないので、これは、ctx.module.exportsctx.exportsの「リンク」を作成しますが、それだけが割り当てられた参照ですctx.module.exports

しかし

ctx.exports = { 
    h: "hello" 
} 

1を割り当てた後、リンクの一部が上書きされます。

あなたがリンクを破壊することなくsys.exportsに新しい値を追加したい場合は、この使用することができます

ctx.exports.h = "hello"; 
関連する問題