反过来也一样:
var x = "42";
var y = false;
x == y; // false
Type(y) 是布尔值,所以 ToNumber(y) 将 false 强制类型转换为 0,然后 "42" == 0 再变成
42 == 0,结果为 false。
也就是说,字符串 "42" 既不等于 true,也不等于 false。一个值怎么可以既非真值也非假
值,这也太奇怪了吧?
这个问题本身就是错误的,我们被自己的大脑欺骗了。
"42" 是一个真值没错,但 "42" == true 中并没有发生布尔值的比较和强制类型转换。这里
不是 "42" 转换为布尔值(true),而是 true 转换为 1,"42" 转换为 42。
这里并不涉及 ToBoolean,所以 "42" 是真值还是假值与 == 本身没有关系!
重点是我们要搞清楚 == 对不同的类型组合怎样处理。== 两边的布尔值会被强制类型转换
为数字。
很奇怪吧?我个人建议无论什么情况下都不要使用 == true 和 == false。
请注意,这里说的只是 ==,=== true 和 === false 不允许强制类型转换,所以并不涉及
ToNumber。
例如:
var a = "42";
强制类型转换 | 81
// 不要这样用,条件判断不成立:
if (a == true) {
// ..
}
// 也不要这样用,条件判断不成立:
if (a === true) {
// ..
}
// 这样的显式用法没问题:
if (a) {
// ..
}
// 这样的显式用法更好:
if (!!a) {
// ..
}
// 这样的显式用法也很好:
if (Boolean( a )) {
// ..
}
避免了 == true 和 == false(也叫作布尔值的宽松相等)之后我们就不用担心这些坑了