JavaScript相等運算符的9條規則

簡介

Java的等號有======三個運算符雖然都讀成「等於」,但概念是不同的,=指的是賦值,在這篇文章中咱們不會進行更多的介紹;==稱爲相等運算符,比較的是兩個操做數值是否相等;===稱爲嚴格相等運算符,比較的是兩個操做數是不是「徹底相同」。數組

針對相等運算符=====,有兩個對應的!=!==運算符,這兩個不相等運算符的運算結果是=====運算結果的相反值。bash

嚴格相等運算符

嚴格相等運算符在對操做數進對比運算時,是不進行類型轉換的。對比規則以下:函數

1. 操做數類型不一樣

對比結果是falseui

1 === "1" // false
true === "true" // false
undefined === true //false
1 === true //false
複製代碼

2.同一類原始類型值

若是兩個值都是原始類型值(數字、字符串、布爾值),值相同就返回true,值不一樣就返回false編碼

對於原始類型值,要注意的是,0-0是相等的;若是兩個值是字符串,須要它們在16位編碼的相同位置上有相同的值纔是相等。若是是不一樣的16位編碼序列,就算有相同的內容,相同的長度,結果也是不相等。spa

'1' === '0' //false
1 === 0x1 // true
複製代碼

3.同是對象

若是兩個值是對象(數組、函數、對象、Symbol),對於兩個對象比較的是引用,若是引用指向的是不一樣的對象,則結果是不相等。code

{} === {} // false
[] === [] // false
(function () {} === function () {}) // false

var v1 = {};
var v2 = v1; //v2和v1指向同一個引用地址
v1 === v2 // true  

// 沒有參數的狀況
let s1 = Symbol();
let s2 = Symbol();

s1 === s2 // false

// 有參數的狀況
let s1 = Symbol('foo');
let s2 = Symbol('foo');
let s3 = s1;
s1 === s2 // false
s1 === s2 // true
複製代碼

4. null和undefined

若是兩個值都是null或者都是undefined,結果是true對象

null === null //true
undefined === undefined //true
複製代碼

5.NaN

若是兩個值都是NaN,結果是false字符串

NAN === NAN //false
複製代碼

NaN和任何數字都不相等,包括它自身string

相等運算符

1. 值的類型相同

應用嚴格相等運算符轉換規則的值類型相同規則(除:操做數類型不一樣)。

2.不一樣原始類型值

若是是不一樣原始類型值(數字、字符串、布爾值)進行比較,將非數字類型轉換成數字,再進行比較。

0 == undefined //false
// 等同於 0 == Number(undefined)
// 等同於0 == NAN

0 == null  //false
// 等同於 0 == Number(null)

1 == true // true
// 等同於 1 == Number(true)

'true' == true // false
// 等同於 Number('true') == Number(true)
// 等同於 NaN === 1

'' == 0 // true
// 等同於 Number('') == 0
// 等同於 0 == 0

'1' == true  // true
// 等同於 Number('1') == Number(true)
// 等同於 1 == 1

'\n 123 \t' == 123 // true
// 由於字符串轉爲數字時,省略前置和後置的空格
複製代碼

3. 對象和原始類型值

若是其中一個操做數是對象,另一個是原始類型值(數字、字符串、布爾值),按以下規則轉:

  • 對象轉換成原始類型
  • 轉換後的原始類型值與另外一個操做數的類型同樣,使用值類型相同的規則
  • 若是不同,將非數字類型轉換成數字再進行比較。

例1:對象對比數字

[1] == 1  //true
複製代碼

解析:
a. [1]先轉換成原始值"1"
b. 轉換後與右邊的操做數1類型不同,將"1"轉換成1
c. 1 == 1 結果是true

例2:對象對比字符串

[1] == "1"
複製代碼

解析:
a. [1]先轉換成原始值"1"
b. 轉換後與右邊的操做數"1"類型同樣,"1"=="1",結果是true

例3:對象對比布爾值

[1] == true
複製代碼

解析:
a. [1]先轉換成原始值"1"
b. 轉換後與右邊的操做數true類型不同,將右邊的操做數true轉換成1
c. 1 == 1結果是true

4. null和undefined

若是其中一個值是null,另一個是undefined,結果是相等

null == undefined
複製代碼

對象轉換爲原始類型規則

比較操做符的操做數多是任意類型,然而只有數字和字符串才能真正執行比較操做,所以那些不是數字和字符串的類型都將進行類型轉換。轉換的規則以下:

  1. 若是對象類型是Date,會調用該對象的toString();
  2. 其餘狀況下,若是valueOf()返回的是原始類型,會調用對象的valueOf()
  3. 其餘狀況下(若是valueOf()不存在或沒有返回原始類型),會調用toString()方法,大部分狀況下是用的這種轉換。
  4. 若是沒有toString()方法,則拋出一個類型異常錯誤

上面的規則只是應用於+==!=中涉及到的對象轉爲原始類型的轉換規則,若是是> ,< 等其餘運算符涉及的轉換,轉換規則中除去日期對象的特殊狀況,其餘是同樣的,也就是說規則是下面這樣的:

  1. 其餘狀況下,若是valueOf()返回的是原始類型,會調用對象的valueOf()
  2. 其餘狀況下(若是valueOf()不存在或沒有返回原始類型),會調用toString()方法,大部分狀況下是用的這種轉換。
  3. 若是沒有toString()方法,則拋出一個類型異常錯誤

總結

嚴格相等運算符的比較是不對操做數進行類型轉換的,只要操做數類型不一致,返回就是false;對於操做數都是原始類型,值相等就返回true,反之返回fase;對於對象,對比的是引用指向的地址,地址是同一個,就返回false,反之返回true;另外介紹了幾個特殊的操做數的對比,undefinednullNaN,其中nullundefined是嚴格相等的,而NaN和任何類型的操做數都不會相等包括它本身。

相等運算符是會對操做數進行類型轉換的,若是操做數的類型相同,則按嚴格相等運算符的規則。如操做數是不一樣的原始值類型,則都轉換成數字再進行比較;若是是原始值類型和對象的比較,則對象先轉換成原始類型值再對比,再比較時若是是相同類型就比較值,若是仍是不一樣,都轉換成數字再進行比較;nullundefined是相等的

+==!=在進行運算時若是涉及到對象類型轉爲原始值時,轉換規則和其餘的運算符是不同的。

相關文章
相關標籤/搜索