Stringは関数として呼び出され、その引数を に変換しますstring。Stringコンストラクターとして呼び出され、プロトタイプがString関数であるオブジェクトを作成します。(関連する ECMAScript 仕様セクションについては、James の回答を確認してください。)
これは確かに紛らわしいです。
2 つの等値演算子は、実際には非常に異なることを行います。ECMA-262、v 5.1 ドキュメントから、次のことを===行います。
Type(x)が と異なる場合はType(y)、 を返しfalseます。
- である場合
Type(x)はUndefined、 を返しtrueます。
- である場合
Type(x)はNull、 を返しtrueます。
Type(x)の場合Number、
a. である場合xはNaN、 を返しfalseます。
b. である場合yはNaN、 を返しfalseます。
c. xが と同じNumber値の場合y、 を返しtrueます。
d. とがである場合xは、 を返します。
e. とがである場合は、 を返します。
f. 戻る。+0y-0true
x-0y+0true
false
Type(x)がの場合、とがまったく同じ文字シーケンス (対応する位置に同じ長さと同じ文字) である場合Stringに返されます。それ以外の場合は、 を返します。truexyfalse
- である場合
Type(x)は、とが両方または両方である場合Booleanに返します。それ以外の場合は、 を返します。truexytruefalsefalse
trueifxを返しy、同じオブジェクトを参照します。それ以外の場合は、 を返しfalseます。
一方==、:
Type(x)が と同じ場合Type(y)、
a. である場合Type(x)はUndefined、 を返しtrueます。
b. である場合Type(x)はNull、 を返しtrueます。
c. Type(x)の場合Number、
i. である場合xはNaN、 を返しfalseます。
ii. である場合yはNaN、 を返しfalseます。
iii. xが と同じNumber値の場合y、 を返しtrueます。
iv。とがである場合xは、 を返します。
v. であり、である場合は、を返します。
vi. 戻る。
d. もしも+0y-0true
x-0y+0true
false
Type(x)isの場合、 とがまったく同じ文字シーケンス (対応する位置に同じ長さと同じ文字) である場合Stringに返されます。それ以外の場合は、 を返します。
e. である場合、とが両方または両方である場合に返します。それ以外の場合は、 を返します。
f. ifを返し、同じオブジェクトを参照します。それ以外の場合は、 を返します。truexyfalse
Type(x)Booleantruexytruefalsefalse
truexyfalse
xが null でy未定義の場合は、 を返しtrueます。
xが未定義でynull の場合は、 を返しtrueます。
Type(x)isNumberとType(y)isの場合String、比較の結果を返し
x == ToNumber(y)ます。
Type(x)isStringとType(y)isの場合Number、比較の結果を返し
ToNumber(x) == yます。
Type(x)である場合Boolean、比較の結果を返しToNumber(x) == yます。
Type(y)である場合Boolean、比較の結果を返しx == ToNumber(y)ます。
Type(x)がStringまたは またはNumberでType(y)ある場合Object、比較の結果を返しx == ToPrimitive(y)ます。
Type(x)がObjectでType(y)が または のいずれStringかである場合Number、比較の結果を返しToPrimitive(x) == yます。
- 戻る
false。
仕様ではType、プリミティブ文字列オブジェクトの はStringであるのに対し、任意のオブジェクト (オブジェクトを含むString)の型は であることに注意してくださいObject。
関連する===行は#1:Typeオブジェクトの が異なるため、falseが返されます。
==関連する行は#8:xはString( "Hello world!") でありy、Object(String文字列を含むオブジェクト"Hello world!") です。したがって、比較x == ToPrimitive(y)が行われます。ToPrimitiveオブジェクトのメソッドを呼び出すvalueOfか、そのメソッドが存在しない場合はメソッドを呼び出しますtoString。この場合、String objectのvalueOfメソッドはstring、オブジェクトに含まれるプリミティブを返します。したがって、今度stringは、同じテキストを含む 2 つのプリミティブの間で等価演算が再度行われ、 のtrueおかげで返され#1.dます。
JavaScript は、ボンネットの下で少し面倒です...
編集: 2 つのオブジェクトが比較される場合、変換は適用されず、ルール#1.fが適用されることに注意してください。したがって、仕様のおかげで、次のコードの出力を正しく予測できました。
> new String("hi") == new String("hi")
false
編集:これらの区別は、より暗黙的な型変換によってさらにぼやけていることを付け加えたいと思いました。たとえば、次のように動作します。
> ("hi").toString()
"hi"
しかし、それ"hi"はオブジェクトだからではありません (Python のように):
> typeof "hi"
"string"
むしろ、.演算子 はプリミティブ型から文字列型への変換(新しい文字列オブジェクトの作成) を行い、そのメソッドが呼び出されるためです。stringObjecttoString