"0"
is a string containing the character 0, it is not the numeric value 0
. The only string-type value which evaluates to false
is ""
.
"0"
is truthy.
Section 9.2 of the ECMAScript 262 specification defines how different types are converted to Boolean:
Argument Type Result
Undefined false
Null false
Boolean The result equals the input argument (no conversion).
Number The result is false if the argument is +0, ?0, or NaN; otherwise the
result is true.
String The result is false if the argument is the empty String (its length is
zero); otherwise the result is true.
Object true
This, however, is only strictly followed when comparing using ===
.
When using Boolean('0')
you're converting the value '0'
to Boolean (which is the same as using !!'0'
). When loosely comparing '0'
with false
, the Boolean value is converted to a number (as defined here). false
, when converted to a number, becomes 0
. This means the final calculation is '0' == 0
which equates to true
.
To summarise the relevant part of the linked section of the ECMAScript specification above:
- Let x =
'0'
and y = false
.
- Check if the type of y is Boolean.
- If true, convert y to a number.
- Compare x to the numeric equivalent of y.
In our case, a JavaScript implementation of this would be:
var x = '0', // x = "0"
y = false; // y = false
if (typeof y === "boolean") {
y = +y; // y = 0
}
console.log( x == y ); // "0" == 0
-> true
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…