關於js中的 「==」 與 「===」

在js中,'==' 和 '==='運算符用來比較兩個值是否相等,可是他們對於相等的定義是不一樣的。兩個運算符均可以用來比較任意類型的操做數,若是兩個操做數相等,返回true,不然,返回false。'===' 嚴格相等運算符,用來比較兩個操做數是否嚴格相等。'==' 相等運算符,用來比較兩個操做數是否相等。
詳細信息可參照ECMA標準(戳這裏)。翻譯

Abstract Equality Comparison ==

== 相等操做符,在比較前會把比較的兩個數轉換成相同的數據類型以後,而後對兩個數進行比較。轉換後,比較方式與 === 相同。code

ECMA中比較規則以下:orm

The comparison x == y, where x and y are values, produces true or false.

1. ReturnIfAbrupt(x).
2. ReturnIfAbrupt(y).
3. If Type(x) is the same as Type(y), then
    Return the result of performing Strict Equality Comparison x === y.
4. If x is null and y is undefined, return true.
5. If x is undefined and y is null, return true.
6. If Type(x) is Number and Type(y) is String,
    return the result of the comparison x == ToNumber(y).
7. If Type(x) is String and Type(y) is Number,
    return the result of the comparison ToNumber(x) == y.
8. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
9. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
10. If Type(x) is either String, Number, or Symbol and Type(y) is Object, then
    return the result of the comparison x == ToPrimitive(y).
11. If Type(x) is Object and Type(y) is either String, Number, or Symbol, then
    return the result of the comparison ToPrimitive(x) == y.
12. Return false.

翻譯以下:對象

比較 x == y,當x 和 y是正常值時,返回 true 或者 false。索引

  1. 若是x不是正常值(好比拋出一個錯誤),中斷執行。
  2. 若是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. 返回假。

簡化一下 ,能夠理解爲:it

  1. 若是兩個操做數類型相同,則進行 x===y。
  2. 若是一個爲null,另外一個爲undefined,則返回true。
  3. 若是兩個操做數均爲基本數據類型,則把操做數轉換爲Number類型進行比較。
  4. 若是其中有一個操做數爲Object,則調用對象的 toString 或者 valueOf 方法,將對象轉化爲原始值進行比較。
  5. 若是不知足上述任何狀況,則返回 false。

Strict Equality Comparison '==='

'===' 嚴格相等操做符,用來比較兩個操做數是否嚴格相等。form

ECMA中比較規則以下:數據類型

1. If Type(x) is different from Type(y), return false.
2. If Type(x) is Undefined, return true.
3. If Type(x) is Null, return true.
4. If Type(x) is Number, then
    a. If x is NaN, return false.
    b. If y is NaN, return false.
    c. If x is the same Number value as y, return true.
    d. If x is +0 and y is −0, return true.
    e. If x is −0 and y is +0, return true.
    f. Return false.
5. If Type(x) is String, then
    a. If x and y are exactly the same sequence of code units (same length and same code           units at corresponding indices), return true.
    b. Else, return false.
6. If Type(x) is Boolean, then
    a. If x and y are both true or both false, return true.
    b. Else, return false.
7. If x and y are the same Symbol value, return true.
8. If x and y are the same Object value, return true.
9. Return false.

翻譯:方法

  1. 若是Type(x)與Type(y)不一樣,則返回false。
  2. 若是Type(x)爲Undefined,則返回true。
  3. 若是Type(x)爲Null,則返回true。
  4. 若是Type(x)是Number,那麼im

    1. 若是x是NaN,則返回false。
    2. 若是y是NaN,則返回false。
    3. 若是x與y的Number值相同,則返回true。
    4. 若是x爲+0且y爲-0,則返回true。
    5. 若是x是-0而y是+0,則返回true。
    6. 返回假。
  5. 若是Type(x)是String,那麼

    1. 若是x和y是徹底相同的代碼單元序列(相同長度和相應索引處的相同代碼單位),則返回true。
    2. 不然返回假。
  6. 若是Type(x)爲Boolean,則
    a.若是x和y都爲true或都爲false,則返回true。
    b.不然返回假。
  7. 若是x和y是相同的符號值,則返回true。
  8. 若是x和y是相同的Object值,則返回true。
  9. 返回假。

簡化一下,能夠理解爲:

  1. 若是兩個操做數類型不相同,返回false。
  2. undefined === undefined => true
  3. null === null => true
  4. 若是操做數的數據類型都爲Number,當兩個數的值相同時,返回true, 不然返回 false。

    注: -0 === +0   => true     +0 === -0 => true
        NaN 與任何值都不相等,包括他本身。 因此要判斷一個數值是否爲NaN, 可採用 x !== x ,只有NaN 返回true
  5. 若是操做數的數據類型都爲String或Boolean時,只有x和y徹底相同,返回ture。
  6. 若是操做數的數據類型都爲Object,只有兩個操做數指向的地址徹底相同時,返回true,不然返回false。
相關文章
相關標籤/搜索