javascript — == vs ===

鐮月發表於2019-02-16

javascript– == vs ===

高階語言層出不窮, 各個語言雖說思想一致,但仍有各自獨特的設計理念和語法, js有許多容易讓人迷惑的地方

1. == vs ===

等於跟全等在js中很是讓人迷惑, 有一個比較有意思的是突然想到在 switch 語句中到底使用的哪種比較方法, 在比較之前先來看看下面的程式, 這下放心了, switch 用的就是 === 方式的比較, 其實在 ESlint 的語法檢測中推薦摒棄 == 的寫法, 採用 === 的寫法規範.

    var a = `1`;
    switch (a) {
        case 1:
            console.log(`==`);
            break;
        case "1":
            console.log(`===`);
            break;
        default:
    }
    //===

== 和 === 更高層次, 首先來說 === 的比較規則

===比較規則:

1、如果型別不同,就[不相等]
2、如果兩個都是數值,並且是同一個值,那麼[相等];(!例外)的是,如果其中至少一個是NaN,那麼[不相等]。(判斷一個值是否是NaN,只能用isNaN()來判斷)
3、如果兩個都是字串,每個位置的字元都一樣,那麼[相等];否則[不相等]。
4、如果兩個值都是true,或者都是false,那麼[相等]。
5、如果兩個值都引用同一個物件或函式,那麼[相等];否則[不相等]。
6、如果兩個值都是null,或者都是undefined,那麼[相等]

==比較規則:

1、如果兩個值型別相同,進行 === 比較。
2、如果兩個值型別不同,他們可能相等。根據下面規則進行型別轉換再比較:
    a、如果一個是null、一個是undefined,那麼[相等]。
    b、如果一個是字串,一個是數值,把字串轉換成數值再進行比較。
    c、如果任一值是 true,把它轉換成 1 再比較;如果任一值是 false,把它轉換成 0 再比較。
    d、如果一個是物件,另一個是數值或字串,把物件轉換成基礎型別的值再比較。物件轉換成基礎型別,利用它的toString或者valueOf方法。js核心內建類,會嘗試valueOf先於toString;例外的是Date,Date利用的是toString轉換。非js核心的物件,令說(比較麻煩,我也不大懂)
    e、任何其他組合,都[不相等]

== 相對於 === 如果物件型別不同的時候會增加一層自動轉化, 在寫 js 儘量全部用 ===代替, 可以省去不必要的 bug 陷阱.

另外一個需要注意的是 switch 中的資料型別可以是任意型別, 與 c , java 等有別.

相關文章