1. ホーム
  2. javascript

[解決済み] JavaScriptで("foo" === new String("foo")) が false に評価されるのはなぜですか?

2023-01-28 15:40:15

質問

文字列を比較するときは常に === (トリプル等号、厳密比較) を使うようにしようと思っていましたが

"foo" === new String("foo")

はfalseで、これも同じ。

var f = "foo", g = new String("foo");
f === g; // false

もちろんです。

f == g; // true

では、文字列の比較には常に == を使用することが推奨されるのでしょうか、それとも常に変数を文字列に変換してから比較するのでしょうか?

どのように解決するのですか?

"foo" は文字列 プリミティブ . (この概念はC#やJavaには存在しません)

new String("foo") はボックス化された文字列オブジェクトです。

=== 演算子 は、プリミティブとオブジェクトで異なる振る舞いをします。 .

プリミティブ(同じ型)を比較する場合。 === は両方が同じ値であれば真を返します。

オブジェクトを比較するとき === は同じオブジェクトを参照している場合のみ真を返します(参照による比較)。 したがって new String("a") !== new String("a") .

あなたの場合 === は false を返します。オペランドが異なる型(一方はプリミティブ、他方はオブジェクト)であるためです。


プリミティブは全くオブジェクトではありません。

そのため typeof 演算子は "object" を返しません。

プリミティブのプロパティにアクセスしようとすると(オブジェクトとして使用する)、Javascript言語はそれをオブジェクトにボックス化し、毎回新しいオブジェクトを作成します。 これについては の仕様です。 .

このため、プリミティブにプロパティを付けることはできません。

var x = "a";
x.property = 2;
alert(x.property) //undefined

と書くたびに x.property , a 異なる ボックス型 String オブジェクトが作成される。