为什么我不使用JS的==运算符

相等运算符

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

相等运算符.png

相等运算符的缺点

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。

严格相等运算符.png

不同类型的值

如果两个值的类型不同,直接返回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

同样的,我也不使用不相等运算符,使用严格不相等运算符。