相等运算符
相等运算符(==),比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。
相等运算符的缺点
'' == '0' // false
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
相等运算符返回true的太多,反正我是记不住,我也不想再记这些乱七八糟的东西,所以我不使用相等运算符,因此要使用严格相等运算符。
严格相等运算符
严格相等运算符(===)比较它们是否为“同一个值”。如果两个值不是同一类型,严格相等运算符(===)直接返回false。
不同类型的值
如果两个值的类型不同,直接返回false。
1 === "1" // false
true === "true" // false
同一类的原始类型值
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false。
1 === 0x1 // true
需要注意的是,NaN与任何值都不相等(包括自身)。另外,正0等于负0。
NaN === NaN // false
+0 === -0 // true
同一类的复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
{} === {} // false
[] === [] // false
(function (){} === function (){}) // false
如果两个变量引用同一个对象,则它们相等。
var v1 = {};
var v2 = v1;
v1 === v2 // true
undefined 和 null
undefined和null与自身严格相等。
undefined === undefined // true
null === null // true
由于变量声明后默认值是undefined,因此两个只声明未赋值的变量是相等的。
var v1;
var v2;
v1 === v2 // true
严格不相等运算符
严格相等运算符有一个对应的“严格不相等运算符”(!==),两者的运算结果正好相反。
1 !== '1' // true
同样的,我也不使用不相等运算符,使用严格不相等运算符。