なぜnode.jsがfalse
に相当する{} == {}
ですが、はtrue
に相当しますか?ここなぜ{} == {}が偽ですが、{} + {} == {} + {}が成り立ちます
> {} == {}
false
> {} + {} == {} + {}
true
なぜnode.jsがfalse
に相当する{} == {}
ですが、はtrue
に相当しますか?ここなぜ{} == {}が偽ですが、{} + {} == {} + {}が成り立ちます
> {} == {}
false
> {} + {} == {} + {}
true
+
文字列連結演算子です。この:
{} == {}
は「私は{}
で1つの{}
を持つオブジェクト、および他のオブジェクトを作成した場合、彼らは同じオブジェクトである?」という意味。答えは「いいえ」です。
この:
{} + {} == {} + {}
は "原始文字列"[object Object][object Object]"
と同じ原始文字列"[object Object][object Object]"
ているのですか?" という意味。答えは「はい」です。
を追加するように編集:コメンターの数が(それはない本当のNaN == NaN
ことをだから){} + {} == {} + {}
が実際にfalse
を返すように、ChromeのWebコンソールで、{} + {}
が数値に加え、NaN + NaN
を実行していることを指摘しています。 FirefoxのウェブコンソールはChromeと同じ結果を出しますが、これをページ内で実行するとnode.jsと同じ結果になります
[編集さ:仕様は{} + {}
が文字列の連結と{} + {} == {} + {}
は真でなければなりませんしなければならないことを指示する方法の長い説明。説明、正しいながら、以下に挙げる、もはやそれほど面白いです]
編集を追加するには:コメントに感謝をjJ'では、私は今、矛盾のより良い説明を提供することができます。
Webコンソールの動作の理由は、Webコンソールに特に式が必要ないためです。それは喜んでif(true) { }
のようなものを受け入れるでしょう。だから、{} + {}
を見ると、式として解釈されません。最初の{}
はネイキッドブロックとして解釈され、+ {}
は式として解釈されます(新しいオブジェクトを作成してプリミティブ番号—に変換します。つまり、NaN
—)。 Webコンソールには、最後の式の結果が表示されます(たとえば、入力3; 4
は出力4
を出力します)。この場合はNaN
です。
{} + {} == {} + {}
は、同様に、即ち「false
続く空きブロック」、すなわち、「NaN == '[object Object][object Object]'
続く空きブロック、」、「(+{}) == ({} + {})
続く空きブロック」と解釈されます。
これは、かっこを使用して修正できます。 ({} + {} == {} + {})
は、たとえば、true
を返します。
(この動作は、Webコンソール固有のものではありません。eval
はeval('{} + {}')
がNaN
とeval('({} + {})')
が'[object Object][object Object]'
であるように、同じルールに従います)
はい、「{object}」の結果が{} + {}から見えました。私はnode.jsで新しく、注意を払っていませんでしたそれはちょうど文字列です、私はそれがノードの内部データ型だと思った:)今は 'typeof({} + {})'が 'string'であることがわかります。素晴らしい答えと説明をありがとう – 0xAX
@ruakh:すばらしい説明! '{} + {} == {} + {}'がchromeとfirefoxで 'false'を返す理由についての考えはありますか? –
@ go-oleg FFの '{} + {}'は 'NaN'です。そして、 'NaN == NaN'はfalseです。なぜなら、** NaNは決してそれ自体と等しくないからです。この説明を参照してください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FNaN – BlackSheep
関連:[WAT?](http://destroyallsoftware.com/talks/wat)それだけで関心の外に、偽のChromeで –
。 –
@RichBradshawはChromeでテストしませんでした。ノードのみでテストしました。 – 0xAX