相等运算符
相等运算符(==),比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。

相等运算符的缺点
1 | '' == '0' // false |
2 | 0 == '' // true |
3 | 0 == '0' // true |
4 | |
5 | 2 == true // false |
6 | 2 == false // false |
7 | |
8 | false == 'false' // false |
9 | false == '0' // true |
10 | |
11 | false == undefined // false |
12 | false == null // false |
13 | null == undefined // true |
14 | |
15 | ' \t\r\n ' == 0 // true |
相等运算符返回true的太多,反正我是记不住,我也不想再记这些乱七八糟的东西,所以我不使用相等运算符,因此要使用严格相等运算符。
严格相等运算符
严格相等运算符(===)比较它们是否为“同一个值”。如果两个值不是同一类型,严格相等运算符(===)直接返回false。

不同类型的值
如果两个值的类型不同,直接返回false。
1 | 1 === "1" // false |
2 | true === "true" // false |
同一类的原始类型值
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。
1 | 1 === 0x1 // true |
需要注意的是,NaN与任何值都不相等(包括自身)。另外,正0等于负0。
1 | NaN === NaN // false |
2 | +0 === -0 // true |
同一类的复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
1 | {} === {} // false |
2 | [] === [] // false |
3 | (function (){} === function (){}) // false |
如果两个变量引用同一个对象,则它们相等。
1 | var v1 = {}; |
2 | var v2 = v1; |
3 | v1 === v2 // true |
undefined 和 null
undefined和null与自身严格相等。
1 | undefined === undefined // true |
2 | null === null // true |
由于变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。
1 | var v1; |
2 | var v2; |
3 | v1 === v2 // true |
严格不相等运算符
严格相等运算符有一个对应的“严格不相等运算符”(!==),两者的运算结果正好相反。
1 | 1 !== '1' // true |
同样的,我也不使用不相等运算符,使用严格不相等运算符。