Javascripit類型轉換比較那點事兒,雙等號(==)

前不久由於一個項目設計的問題,煩心了好幾天,爲了避免留坑擁抱強類型語言特色,仍是選擇了'==='做爲數據判斷是否相等,對於'=='今天來探究一下貓膩(弱類型的JavaScript的坑真的太多了,typescript真香)typescript

'==' 操做符

這個操做符相信學過開發的人徹底不陌生,對於強類型語言我這兒就不作過多描述,我們這兒就鑽JavaScript的牛角尖設計

x == y,x,y都表示一個值,這個操做符返回的是bool值true或者false;code

對於這個操做有相對應的比較方式(對於全部的JavaScript類型):對象

1.若type(x)和type(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.若 x 爲 -0且 y 爲 +0,返回true
    d.若type(x)爲string,則當 x , y 徹底爲相同字符序列的時候(長度和相同位置的字符同樣)返回true
    e.若type(x)爲boolean,當 x , y 同爲true返回true,不然返回false
 2.若 x 爲null且 y 爲undefined,返回true
 3.若 x 爲undefined且 y 爲null,返回true
 4.若type(x)爲number且type(y)爲string,返回x == ToNumber(y)的結果
 5.若type(x)爲string且type(y)爲number,返回ToNumber(x) == y的結果
 6.若type(x)爲boolean,返回ToNumber(x) == y的結果。同理,若type(y)爲boolean,返回ToNumber(y) == x的結果
 7.若type(x)爲string或者number,且type(y)爲object,返回x == ToPrimitive(y)的結果。同理,若type(y)爲string或者number,且type(x)爲object,返回y == ToPrimitive(x)的結果

ToPrimitive是對象轉換基本類型的方法。ip

看個例子:開發

[] == ![] // true
根據上述規則來解析:string

1.![]爲false,上式爲: [] == false

2.第6條:上式爲: [] == ToNumber(false) => [] == 0,

3.第7條:上式爲:ToPrimitive([]) == 0,

4.[].toString() = '',上式爲:'' == 0,

5.第4條:上式爲:0 == 0 => true
相關文章
相關標籤/搜索