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. 戻る。+0
y
-0
true
x
-0
y
+0
true
false
Type(x)
がの場合、とがまったく同じ文字シーケンス (対応する位置に同じ長さと同じ文字) である場合String
に返されます。それ以外の場合は、 を返します。true
x
y
false
- である場合
Type(x)
は、とが両方または両方である場合Boolean
に返します。それ以外の場合は、 を返します。true
x
y
true
false
false
true
ifx
を返し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. もしも+0
y
-0
true
x
-0
y
+0
true
false
Type(x)
isの場合、 とがまったく同じ文字シーケンス (対応する位置に同じ長さと同じ文字) である場合String
に返されます。それ以外の場合は、 を返します。
e. である場合、とが両方または両方である場合に返します。それ以外の場合は、 を返します。
f. ifを返し、同じオブジェクトを参照します。それ以外の場合は、 を返します。true
x
y
false
Type(x)
Boolean
true
x
y
true
false
false
true
x
y
false
x
が null でy
未定義の場合は、 を返しtrue
ます。
x
が未定義でy
null の場合は、 を返し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"
むしろ、.
演算子 はプリミティブ型から文字列型への変換(新しい文字列オブジェクトの作成) を行い、そのメソッドが呼び出されるためです。string
Object
toString