2017-01-30 6 views
1

明示的に呼び出されたStringコンストラクタと暗黙的な文字列を比較するとtrueと評価されますが、newキーワードを追加すると深い等価でfalseが評価されますが、再び浅い等価でtrueと評価されますか?これはなぜ偽と評価されますか?

> "hello"===String("hello") 
true 
> "hello"==new String("hello") 
true 
> "hello"===new String("hello") 
false 

編集:さらにテストの後、これは暗黙のコンストラクタを持っているすべてのタイプで発生するように見えます。

編集2:明確にする、これは=====の問題ではなく、明示的なコンストラクタ対暗黙的の一つ。

+4

'' hello "' '' string''、 '' hello ")' 'オブジェクト ''のようになります。 – Biffen

+1

' == '値(' '4" == 4 > true')しかし '==='は型もチェックします。 ( '' 4 "=== 4> false')を返します。 –

+0

@ ibrahimmahrir:どちらもタイプをチェックします。 '=='は型が同じでないと判明した場合に型強制アルゴリズムに入ります。 '=='が値だけをチェックした場合、 '4 ==" 4 "'は 'false'になります。 –

答えて

5

newキーワードを使用すると、オブジェクトが作成されます。 new String('hello')のタイプを確認する場合は、タイプがobjectであることがわかります。 'hello'のタイプをチェックすると、stringが得られます。

strict equals演算子(===)を使用すると、値と型の両方がチェックされるため、一致しない型のためにfalseが返されます。文字列から返さ

文字列リテラル(二重引用符または一重引用符で示される)と、文字列以外で呼び出します:Stringグローバルオブジェクト時に呼び出すことnot the same as calling the constructor using newあるのでnewキーワードのない式がtrueを返す

理由があります-constructorコンテキスト(つまり、newキーワードを使用しない)はプリミティブ文字列です。厳密な検査がtrueを返すよう

このように、戻り値のタイプは、stringなくobjectであろう。

1

=====の違いは、===はタイプが同じであることが必要であり、==はそうでないことです。

これは、"hello"String("hello")の両方が同じタイプ(string)であることを示しています。 new String("hello")は同じ値ですが、異なるタイプです(object

関連する問題