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

faker發表於2019-02-16

前不久因為一個專案設計的問題,煩心了好幾天,為了不留坑擁抱強型別語言特點,還是選擇了`===`作為資料判斷是否相等,對於`==`今天來探究一下貓膩(弱型別的JavaScript的坑真的太多了,typescript真香)

`==` 操作符

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

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

對於這個操作有相對應的比較方式(對於所有的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是物件轉換基本型別的方法。

看個例子:

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

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

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

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

4.[].toString() = ``,上式為:`` == 0,

5.第4條:上式為:0 == 0 => true

相關文章