js操做符類型轉換

先看一段代碼,執行結果有些奇怪,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
相關文章
相關標籤/搜索