== 表明相同, ===表明嚴格相同,javascript
進一步解釋: 當進行雙等號比較時候: 先檢查兩個操做數數據類型,若是相同, 則進行===比較, 若是不一樣, 則進行一次類型轉換, 轉換成相同類型後再進行比較, 而===比較時, 若是類型不一樣,直接返回false.前端
根據具體須要,JavaScript 按照以下規則將變量轉換成布爾類型:java
false
、0
、空字符串(""
)、NaN
、null
和undefined
被轉換爲false
- 全部其餘值被轉換爲
true
上述兩段話你們應該都知道,被問到也都能答上來。函數
問:1 == true 返回什麼?post
答:trueui
問:2 == true 返回什麼?spa
答:falsecode
你的腦子裏可能會想, 2轉成boolean
不是true
麼?可是,實際上,當boolean
與number
作雙等判斷時,是將true
轉成1再與數字作比較cdn
若是你不知道這個,那就浪費5分鐘看一下下文吧~對象
記筆記:
NaN === NaN // false
+0 === -0 // true
等式
(x !== x)
成立的惟一狀況是 x 的值爲 NaN)
在比較前將兩個被比較的值轉換爲相同類型。在轉換後(等式的一邊或兩邊均可能被轉換)
若是沒法轉成同類型就報錯
ECMAS實現雙等的抽象比較的邏輯以下:
x == y
x 與 y 類型相同
a. Type(x) 爲 undefined,返回true
b. Type(x) 爲 null,返回true
c. Type(x) 爲 number,則
i. x 爲NaN,返回false
ii. y 爲NaN,返回false
iii. x 與 y的值相等,返回 true
iv. x = +0, y = - 0, 返回true
v. 返回 false
複製代碼
d. 若是 Type(x) 爲 string, y 爲與 x 一致的字符串,返回 true, 不然返回 false
e. Type(x) 爲 number,判斷是否都是true或者false
f. Type(x) 爲對象, x 和 y 指向同一對象時返回true,不然返回 false
x 爲 null,y 爲 undefined, 返回 true
x 爲 undefined,y 爲 null, 返回 true
數字 == 字符串,string 轉成number
boolean == any, boolean 轉成 number, 而後從新進行雙等比較
字符串 == 對象 或 數字 == 對象, 調用 ToPrimitive(object) 轉成 string 或 number
返回 false
ToPrimitive(A)
經過嘗試調用 A 的A.toString()
和A.valueOf()
方法,將參數 A 轉換爲原始值(Primitive)。
ToNumber(A)
嘗試在比較前將參數 A 轉換爲數字,這與 +A(單目運算符+)的效果相同。
上圖說話,按從上到下的邏輯執行:
相等操做符對於不一樣類型的值,進行的比較以下圖所示:
被比較值 B | |||||||
---|---|---|---|---|---|---|---|
Undefined | Null | Number | String | Boolean | Object | ||
被比較值 A | Undefined | true |
true |
false |
false |
false |
IsFalsy(B) |
Null | true |
true |
false |
false |
false |
IsFalsy(B) |
|
Number | false |
false |
A === B |
A === ToNumber(B) |
A=== ToNumber(B) |
A== ToPrimitive(B) |
|
String | false |
false |
ToNumber(A) === B |
A === B |
ToNumber(A) === ToNumber(B) |
ToPrimitive(B) == A |
|
Boolean | false |
false |
ToNumber(A) === B |
ToNumber(A) === ToNumber(B) |
A === B |
ToNumber(A) == ToPrimitive(B) | |
Object | false | false | ToPrimitive(A) == B |
ToPrimitive(A) == B |
ToPrimitive(A) == ToNumber(B) | A === B |
例子
var num = 0;
var obj = new String("0");
var str = "0";
var b = false;
console.log(num == num); // true
console.log(obj == obj); // true
console.log(str == str); // true
console.log(num == obj); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true
// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
複製代碼
有些開發者認爲,最好永遠都不要使用相等操做符。全等操做符的結果更容易預測,而且由於沒有隱式轉換,全等比較的操做會更快。
小知識:
Object.is(a,b)
判斷a與b是否徹底相等,與===基本相同,不一樣點在於Object.is判斷+0不等於-0
,NaN等於自身
若是你收穫了新的知識,請給做者點個贊吧~
相關係列: 從零開始的前端築基之旅(超級精細,持續更新~)
參考文檔