100

文字列値を比較するときは常に === (三重等号、厳密な比較) を使い始めるつもりでしたが、今では

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

は false で、これと同じです:

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

もちろん:

f == g; // true

では、文字列比較には常に == を使用するか、比較する前に常に変数を文字列に変換することをお勧めしますか?

4

5 に答える 5

127

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

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

===オペレータは、プリミティブとオブジェクトで異なる動作をします
(同じタイプの) プリミティブを比較するとき===、両方が同じ値を持つ場合は true を返します。

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

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


プリミティブはオブジェクトではありません。オペレータはプリミティブに対して戻りませ
ん。typeof"object"

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

これが、プリミティブにプロパティを配置できない理由です。

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

を記述するたびx.propertyに、異なるボックス化Stringされたオブジェクトが作成されます。

于 2012-06-08T15:39:56.050 に答える
34

を使用して===

  • Object は、それ自体への別の参照を除いて、何にも等しいことはありません。

  • タイプと値が同じである場合、プリミティブは別のプリミティブと比較して同等です。

于 2012-06-08T15:40:26.397 に答える
10

このnew言葉はここでは犯罪者です(いつものように、私は言うかもしれません)...

を使用すると、オブジェクトnewを操作したいという希望を明示的に表現します。それはあなたにとって驚くべきことかもしれませんが、これは:

var x = new String('foo');
var y = new String('foo');
x === y; 

...あなたに強力なものを与えるでしょうfalse。簡単です。比較されるのはオブジェクトの内部ではなく、オブジェクトの参照です。もちろん、2つの異なるオブジェクトが作成されたため、これらは等しくありません。

おそらく使用したいのは変換です:

var x = String('foo');
var y = String('foo');
x === y;

...そしてそれは結果としてあなたに期待通りにあなたを与えるでしょうtrue、それであなたはあなたの平等でfoos永遠に喜びそして繁栄することができます。)。

于 2012-06-08T15:51:26.120 に答える
4

fooは純粋な文字列でnew String("foo")あり、オブジェクト文字列です

于 2012-06-08T15:40:24.977 に答える
2

node.js REPL(インストールされている場合はコマンドラインの「ノード」)から:

> "foo" === (new String("foo")).valueOf()
true
> "foo" === new String("foo")
false
> typeof("foo")
'string'
> typeof(new String("foo"))
'object'
> typeof((new String("foo")).valueOf())
'string'
于 2012-06-08T18:47:56.257 に答える