
上QQ阅读APP看书,第一时间看更新
1.3.4 相等运算符(==和===)
这两个相等运算符的使用可能会引起一些困惑。
使用==时,不同类型的值也可以被看作相等。这样的结果可能会使那些资深的JavaScript开发者都感到困惑。我们用下面的表格给大家分析一下不同类型的值用相等运算符比较后的结果。

如果x和y的类型相同,JavaScript会用equals方法比较这两个值或对象。没有列在这个表格中的其他情况都会返回false。
toNumber和toPrimitive方法是内部的,并根据以下表格对其进行估值。
toNumber方法对不同类型返回的结果如下。

toPrimitive方法对不同类型返回的结果如下。

用例子来验证一下表格中的结果。首先,我们知道下面的代码输出true(字符串长度大于1)。
console.log('packt' ? true : false);
那么下面这行代码的结果呢?
console.log('packt' == true);
输出是false,为什么会这样呢?
❑ 首先,布尔值会被toNumber方法转成数,因此得到packt == 1。
❑ 其次,用toNumber转换字符串值。因为字符串包含字母,所以会被转成NaN,表达式就变成了NaN == 1,结果就是false。
那么下面这行代码的结果呢?
console.log('packt' == false);
输出也是false,为什么呢?
❑ 首先,布尔值会被toNumber方法转成数,因此得到packt == 0。
❑ 其次,用toNumber转换字符串值。因为字符串包含字母,所以会被转成NaN,表达式就变成了NaN == 0,结果就是false。
那么===运算符呢?简单多了。如果比较的两个值类型不同,比较的结果就是false。如果比较的两个值类型相同,结果会根据下表判断。

如果x和y类型不同,结果就是false。我们来看一些例子。
console.log('packt' === true); // false
console.log('packt' === 'packt'); // true
var person1 = {name:'John'};
var person2 = {name:'John'};
console.log(person1 === person2); // false,不同的对象