问题
In David Flanagan's Javascript guide, there is a statement:
the == operator never attempts to convert its operands to boolean
So here I did a little test:
var a = false;
var b = ""; // empty string
a == b; //returns true
Looking at Abstract Equality Comparison Algorithm there is a point:
e. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
How can x and y be both true if y is string data type (without conversion)?
回答1:
What happens under the hood is
If
Type(x)
isBoolean
, return the result of the comparisonToNumber(x) == y
.
Number(false) == ""
followed by
If
Type(x)
isNumber
andType(y)
isString
, return the result of the comparisonx == ToNumber(y)
.
Number(false) == Number("") -> 0 == 0
How can x and y be both true if y is string data type (without conversion)?
They are not both true
, but after type coercion their values are equal.
the == operator never attempts to convert its operands to boolean
And that is correct, if you check the comparison algorithm you will find that types are never implicitly casted to Boolean
.
References:
- 11.9.3 The Abstract Equality Comparison Algorithm
- 9.3 ToNumber
来源:https://stackoverflow.com/questions/31888631/javascript-equality-operators