天天看點

JavaScript中==和===的差別嚴格運算符的運算規則相等運算符的運算規則不相等運算符的缺點

JavaScript

提供兩種相等運算符:== 和 ===。

在日常開發中,通常推薦使用===,那麼這兩者到底有什麼差別呢?

簡單說,它們的差別是相等運算符(==)比較兩個值是否相等,嚴格相等運算符(=== )比較它們是否為“同一個值”。如果兩個值不是同一類型,嚴格相等運算符(===)直接傳回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
      

是以不要使用相等運算符(==),最好隻使用嚴格相等運算符(===)。

繼續閱讀