web-dev-qa-db-ja.com

new String( 'hello')=== new String( 'hello')がFalseと評価されるのはなぜですか?

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

new String('hello') === new String('hello')
48
santosh kore

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

そう "hello" === "hello"は文字列プリミティブであるためtrueになります。

58
Pointy

文字列の比較とは異なり、オブジェクトインスタンスを比較しています('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')
17

2つの異なるオブジェクトを比較しているため、falseと評価されます。newは新しいオブジェクトを作成します。

関連記事: JavaScriptの「new」キーワードとは何ですか? これは(広範な)回答で説明されています:

それは[新しい] 4つのことです:

  1. 新しいオブジェクトを作成します。このオブジェクトのタイプは、単純にobjectです。
  2. この新しいオブジェクトの内部のアクセスできない[[prototype]]プロパティを、コンストラクター関数の外部のアクセス可能なに設定します。 )prototypeオブジェクト(すべての関数オブジェクトには自動的にprototypeプロパティがあります)。
  3. thisが言及されるたびに、新しく作成されたオブジェクトを使用して、コンストラクター関数を実行します。
  4. コンストラクター関数が非プリミティブ値を返さない限り、新しく作成されたオブジェクトを返します。この場合、その非プリミティブ値が返されます。
12
BeyelerStudios

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

たとえば、「He​​llo World」という単語が書かれた紙(Paper1)があり、兄が「HelloWorld」という単語が書かれた別の紙(Paper2)があるとします。

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

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

8
ccorrin
typeof(new String()) === 'object';
==> true

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

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

ヒープとスタック

6
Cody

また、if({hello:1} === {hello:1}){console.log( "yay"); console.logはオブジェクトであるため、発生することはありません。

(私の最初の例として)2つのリテラルオブジェクトを比較するには、これらのオブジェクトでループを作成し、違いが見つかったときに結果を確認します。インスタンス化されたオブジェクトでこのトリックを実行するのはより困難です。2つの関数を比較してください。

しかし、JavaScriptがそれを行わない場合、これは非常に重いためです。関数などであるかどうかを文字列化するために、各属性の各タイプをチェックする必要があります...そして明らかにそれを行うことは役に立ちません。

Typeofは「object」を返すため、2つのオブジェクト「origins」をチェックする場合はinstanceofを使用できます。また、2つの "new String"オブジェクトをテストするには、toString new String( "hello")。toString()== new String( "hello")。toString()を使用するか、属性をテストせずにオブジェクトをチェックする必要があります。 new String( "hello")instanceof String && new String( "hello")instanceof String

本当です。

BeyelerStudiosによって提供されたリンクは、新しい機能が何をするかを完全に説明しています。それが役立つことを願っています。

5
Inateno

あなたのコードは本質的に「一枚の紙を取り、それに「こんにちは」と書いてください。別の紙を取り、それに「こんにちは」と書いてください。それらは同じ紙ですか?」と言っています。

5
David Richerby