先看一段代碼,執行結果有些奇怪,a>=b同時a<=b可是a!=b。函數
var a = function() {}; var b = function() {}; a == b // false a != b // true a >= b // true a <= b // true
這涉及到js中操做符引發的類型轉換。spa
ES規範中==的判斷流程爲:code
1.ReturnIfAbrupt(x)
2.ReturnIfAbrupt(y)
3.若是Type(x)與 Type(y)相同,返回x===y
4.若是x爲null,y爲undefined,返回true
5.若是x爲undefined,y爲null,返回true
6.若是Type(x)是Number,Type(y)是String,返回x == ToNumber(y)
7.若是Type(x)是String,Type(y)是Number,返回ToNumber(x) == y
8.若是Type(x)是Boolean,返回ToNumber(x) == y
9.若是Type(y)是Boolean,返回x == ToNumber(y)
10.若是Type(x)是String、Number或者Symbol,Type(y)是Object,返回x == ToPrimitive(y)
11.若是Type(x)是Object,Type(y)是String、Number或者Symbol,返回ToPrimitive(x)==y
12.返回false
ReturnIfAbrupt判斷參數是否正常值,若有報錯,中斷執行;Type函數至關於typeOf操做符結果;ToPrimitive返回參數的原始值,在全等於操做符中返回對象依次嘗試調用valueOf或者toString方法的結果,直到結果爲非對象對象
總結一下就是:
一、若是兩側參數類型相同,使用嚴格等於比較;
二、null與undefined兩兩相等;
三、如有布爾類型則轉化爲數字;
四、字符串和數字比較時把字符串轉化爲數字,進入1;
五、Object類型與Number、String、Symbol類型比較時,使用Object對象的原始值進行比較
六、其餘狀況返回false圖片
在上面代碼中a和b的類型都是「function」,應使用嚴格等於進行比較,它們有不一樣的引用並非同一個值,因此結果爲false字符串
大於、小於首先使用valueOf方法對左右表達式求原始值,再進行比較。在上面代碼中a、b調用valueOf方法返回的是自身方法字符串,所以>=和<=都成立。
咱們還能夠對a、b的valueOf方法進行重寫it
a.valueOf=function(){return 1;} b.valueOf=function(){return 2;} a > b // false a < b // true
規則爲:
一、先求兩側表達式原始值
二、若其中一個爲字符串,返回字符串合併
三、兩側表達式轉化爲數字類型進行運算
還有一些特殊狀況:io
Infinity-Infinity // NaN Infinity+Infinity // Infinity -Infinity+(-Infinity) // -Infinity +0+0 // +0 +0+(-0) // +0 -0+(-0) // -0 +5+(-5) // +0