0 == false
両方とも'0' == false
「真」です
しかし、(true && 0)
は「偽」であり、一方(true && '0')
は「真」です。
なんで?
0 == false
両方とも'0' == false
「真」です
しかし、(true && 0)
は「偽」であり、一方(true && '0')
は「真」です。
なんで?
抽象比較( ==
) 規則はES5 11.9.3で説明されていますが、論理演算子 () の規則はES5 11.11&&
で説明されています。
要するに、==
は よりも複雑です&&
。&&
内部を使用してそのオペランドを評価するだけでToBoolean()
、、、および/または を==
使用する可能性のあるさまざまな条件があります。ToBoolean()
ToNumber()
ToPrimitive()
(0 == false) == true
:
7. Type(y) が Boolean の場合、比較結果 x == ToNumber(y) を返す
ToNumber(false) === 0
、そう0 == 0
、そうtrue
。
('0' == false) == true
:
これも手順 7 を通過し、結果は になり'0' == 0
ます。
次に、最初からやり直して、ステップ 5 に到達します。
5. Type(x) が String で Type(y) が Number の場合、比較 ToNumber(x) == y の結果を返します。
ToNumber('0') === 0
、そうまた0 == 0
、そしてまたtrue
。
!!(true && 0) == false
&&
falsy ( )の場合は第 1 オペランドを返し、第 2 オペランドを返しますToBoolean(...) === false
。
厳密には(true && 0) === 0
。
また、if
条件として使用すると、結果 ( 0
) もandを介して渡さToBoolean(...)
ToBoolean(0) === false
れます。
!!(true && '0') == true
繰り返しますが、これは 2 番目のオペランド を返します'0'
。
ToBoolean('0') === true
ただし、今回は、'0'
空でない String であるため、trueになります。
また、より単純な比較規則が必要な場合は、厳密な比較を使用してください( ===
, 11.9.6 )。
「0」(または任意の空でない文字列) は、JS では「真実」です。ただし、== 演算子はいくつかの奇妙な型強制を行うため、Crockford を含む多くの著名な JS 人物がそれを強く思いとどまらせています。これは、これを避けるべき理由の良い例です。これは、文字列 '0' を取り、それを誤った値に強制します。
このプロセスを説明するリンクは次のとおりです。
http://webreflection.blogspot.com/2010/10/javascript-coercion-demystified.html
If Type(x) is Boolean, return the result of the comparison
ToNumber(x) == y: false == 0 and true == 1 but true != 2
あなたの例よりもさらに奇妙なのはこれです:
('1' == true) // true
('2' == true) // false!