The behavior of == is a bit lengthy, but clearly defined in the ecma-262 spec:
11.9.3 The Abstract Equality Comparison Algorithm
The comparison x == y, where x and y
are values, produces true or false.
Such a comparison is performed as
follows:
- If Type(x) is different from Type(y), go to step 14.
- If Type(x) is Undefined, return true.
- If Type(x) is Null, return true.
- If Type(x) is not Number, go to step 11.
- If x is NaN, return false.
- If y is NaN, return false.
- If x is the same number value as y, return true.
- If x is +0 and y is ?0, return true.
- If x is ?0 and y is +0, return true.
- Return false.
- If Type(x) is String, then return true if x and y are exactly the same
sequence of characters (same length
and same characters in corresponding
positions). Otherwise, return false.
- If Type(x) is Boolean, return true if x and y are both true or both
false. Otherwise, return false.
- Return true if x and y refer to the same object or if they refer to
objects joined to each other (see 13.1.2). Otherwise, return false.
- If x is null and y is undefined, return true.
- If x is undefined and y is null, return true.
- If Type(x) is Number and Type(y) is String, return the result of the
comparison x == ToNumber(y).
- If Type(x) is String and Type(y) is Number, return the result of the
comparison ToNumber(x) == y.
- If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
- If Type(y) is Boolean, return the result of the comparison x ==
ToNumber(y).
- If Type(x) is either String or Number and Type(y) is Object, return
the result of the comparison x ==
ToPrimitive(y).
- If Type(x) is Object and Type(y) is either String or Number, return the
result of the comparison
ToPrimitive(x) == y.
- Return false.
Step 16 applies to your former example:
0 == "0" // apply 16
≡ 0 == toNumber("0")
≡ 0 == 0 // apply 7
≡ true
And step 18, then step 16, apply to the latter:
true == "true" // apply 18
≡ toNumber(true) == "true"
≡ 1 == "true" // apply 16
≡ 1 == toNumber("true")
≡ 1 == NaN // apply 6
≡ false
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…