51

次のステートメントが JavaScript で false を返すのはなぜですか?

new String('hello') === new String('hello')
4

7 に答える 7

62

2 つの Stringオブジェクトは、常に互いに等しくありません。JavaScript には、文字列プリミティブ値と、ラッパー オブジェクトを作成するための文字列コンストラクタがあることに注意してください。すべてのオブジェクト等価比較 (特に を使用) は、参照等価===のテストとして実行されます。もちろん、2 つの異なるオブジェクトへの参照が互いに等しくなることはありません。

これらは文字列プリミティブであるためです"hello" === "hello"true

于 2014-09-03T15:02:09.957 に答える
19

オブジェクト インスタンスを比較していますが、これは文字列比較とは異なります ( 'hello' === 'hello') Javascript でオブジェクトを比較すると、実際にはオブジェクトのメモリ アドレスが比較され、オブジェクトごとにメモリ アドレスが異なるため、常に false が返されます。

オブジェクト インスタンスの代わりに文字列値を比較する - jsFiddle

( String('hello') === String('hello') ) // returns true due to comparing strings

2 つのオブジェクトを厳密に比較する - falseは同じオブジェクトではありません

new String('hello') === new String('hello')

2 つの文字列を厳密に比較する - true、同じ戻り値、同じ戻り値の型

String('hello') === String('hello')
于 2014-09-03T15:06:48.323 に答える
8

変数内に存在する文字列値ではなく、変数の 2 つの異なるインスタンスを比較するように JavaScript に要求しています。

たとえば、私が「Hello World」という単語が書かれた紙 (Paper1) を持っていて、弟が「Hello World」という単語が書かれた別の紙 (Paper2) を持っているとします。

Paper1 === Paper2 と言うと、偽になります。紙に書かれている言葉は同じでも、まったく同じ紙ではないからです。

Paper1.toString() === Paper2 .toString() と言う場合、実際の紙自体ではなく、紙に書かれた単語を比較しているため、真になります。

于 2014-09-03T18:20:28.697 に答える
6
typeof(new String()) === 'object';
==> true

(new Object()) === (new Object());
==> false

「 Heap 」内の「オブジェクト」構造はすべて一意です。

ヒープとスタック

于 2014-09-03T16:10:45.517 に答える