提供兩種相等運算符:== 和 ===。
在日常開發中,通常推薦使用===,那麼這兩者到底有什麼差別呢?
簡單說,它們的差別是相等運算符(==)比較兩個值是否相等,嚴格相等運算符(=== )比較它們是否為“同一個值”。如果兩個值不是同一類型,嚴格相等運算符(===)直接傳回false,而相等運算符(==)會将它們轉換成同一個類型,再用嚴格相等運算符進行比較。
用通俗的說法,爹==幹爹: true;爹===幹爹: false……
嚴格運算符的運算規則
1、不同類型的值
如果兩個值的類型不同,直接傳回false。
1 === "1" // false
true === "true" // false
2、同一類的原始類型值
同一類型的原始類型的值(數值、字元串、布爾值)比較時,值相同就傳回true,值不同就傳回false。
1 === 0x1 // true
3、複合類型值
兩個複合類型(對象、數組、函數)的資料比較時,不是比較它們的值是否相等,而是比較它們是否指向同一個位址。
{} === {} // false
[] === [] // false
(function () {} === function () {}) // false
如果兩個變量引用同一個對象,則它們相等。
var v1 = {};
var v2 = v1;
v1 === v2 // true
4、undefined 和 null
undefined 和 null與自身嚴格相等。
undefined === undefined // true
null === null // true
5、嚴格不相等運算符
嚴格相等運算符有一個對應的“嚴格不相等運算符”(!==),它的算法就是先求嚴格相等運算符的結果,然後傳回相反值。
1 !== '1' // true
相等運算符的運算規則
相等運算符用來比較相同類型的資料時,與嚴格相等運算符完全一樣。
比較不同類型的資料時,相等運算符會先将資料進行類型轉換,然後再用嚴格相等運算符比較。類型轉換規則如下。
1、原始類型的值
原始類型的資料會轉換成數值類型再進行比較。
1 == true // true
// 等同于 1 === Number(true)
0 == false // true
// 等同于 0 === Number(false)
2 == true // false
// 等同于 2 === Number(true)
2 == false // false
// 等同于 2 === Number(false)
'true' == true // false
// 等同于 Number('true') === Number(true)
// 等同于 NaN === 1
'' == 0 // true
// 等同于 Number('') === 0
// 等同于 0 === 0
'' == false // true
// 等同于 Number('') === Number(false)
// 等同于 0 === 0
'1' == true // true
// 等同于 Number('1') === Number(true)
// 等同于 1 === 1
'\n 123 \t' == 123 // true
2、對象與原始類型值比較
對象(這裡指廣義的對象,包括數組和函數)與原始類型的值比較時,對象轉化成原始類型的值,再進行比較。
[1] == 1 // true
// 等同于 Number([1]) == 1
[1] == '1' // true
// 等同于 Number([1]) == Number('1')
[1] == true // true
// 等同于 Number([1]) == Number(true)
3、undefined 和 null
undefined和null與其他類型的值比較時,結果都為false,它們互相比較時結果為true。
false == null // false
false == undefined // false
0 == null // false
0 == undefined // false
undefined == null // true
4、 不相等運算符
相等運算符有一個對應的“不相等運算符”(!=),兩者的運算結果正好相反。
1 != '1' // 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
是以不要使用相等運算符(==),最好隻使用嚴格相等運算符(===)。