JavaScript 的 == 和 === 怎麼理解

相信每個對JavaScript和HTML有一定開發經驗的程序員都會對JavaScript這麼神奇的語言發出感嘆!特別是修改別人的代碼內心都是奔潰的,或者在查找程序錯誤的時候心有都是一萬個草泥馬跑過。

今天我抽個時間總結總結一下==和===比較容易出錯特別是有的時候出錯了還找不到問題點吧!

`===` 嚴格相等,會比較兩個值的類型和值

`==` 抽象相等,比較時,會先進行類型轉換,然後再比較值

不同類型的值也可以比較,在JAVA,Python等語言裡面這樣直接報錯的了,在開發的時候如果沒有留個心眼,出錯了都沒有辦法找,這就是JavaScript神奇的地方了。

===式

  • 如果Type(x)和Type(y)不同,返回false
  • 如果Type(x)和Type(y)相同
  • 如果Type(x)是Undefined,返回true
  • 如果Type(x)是Null,返回true
  • 如果Type(x)是String,當且僅當x,y字符序列完全相同(長度相同,每個位置上的字符也相同)時返回true,否則返回false
  • 如果Type(x)是Boolean,如果x,y都是true或x,y都是false返回true,否則返回false
  • 如果Type(x)是Symbol,如果x,y是相同的Symbol值,返回true,否則返回false
  • 如果Type(x)是Number類型
  • 如果x是NaN,返回false
  • 如果y是NaN,返回false
  • 如果x的數字值和y相等,返回true
  • 如果x是+0,y是-0,返回true
  • 如果x是-0,y是+0,返回true
  • 其他返回false

==式

  • 如果Type(x)和Type(y)相同,返回x===y的結果
  • 如果Type(x)和Type(y)不同
  • 如果x是null,y是undefined,返回true
  • 如果x是undefined,y是null,返回true
  • 如果Type(x)是Number,Type(y)是String,返回 x==ToNumber(y) 的結果
  • 如果Type(x)是String,Type(y)是Number,返回 ToNumber(x)==y 的結果
  • 如果Type(x)是Boolean,返回 ToNumber(x)==y 的結果
  • 如果Type(y)是Boolean,返回 x==ToNumber(y) 的結果
  • 如果Type(x)是String或Number或Symbol中的一種並且Type(y)是Object,返回 x==ToPrimitive(y) 的結果
  • 如果Type(x)是Object並且Type(y)是String或Number或Symbol中的一種,返回 ToPrimitive(x)==y 的結果
  • 其他返回false

面兩個片段是ecma262規範中對===和==計算過程的定義,翻譯過來的。看不明白沒有關係下面慢慢解析。

其中涉及到幾個es定義的抽象操作:

  • Type(x) : 獲取x的類型
  • ToNumber(x) : 將x轉換為Number類型
  • ToBoolean(x) : 將x轉換為Boolean類型
  • ToString(x) : 將x轉換為String類型
  • SameValueNonNumber(x,y) : 計算非數字類型x,y是否相同
  • ToPrimitive(x) : 將x轉換為原始值

這裡的每個操作都有其嚴格並複雜的定義,可以直接查閱ECMA規範文檔對其的詳細說明。

斷言:Type(x)不是Number類型
斷言:Type(x)和Type(y)不同

如果Type(x)是Undefined,返回true
如果Type(x)是Null,返回true
如果Type(x)是String,當且僅當x,y字符序列完全相同(長度相同,每個位置上的字符也相同)時返回true,否則返回false
如果Type(x)是Boolean,如果x,y都是true或x,y都是false返回true,否則返回false
如果Type(x)是Symbol,如果x,y是相同的Symbol值,返回true,否則返回false
如果x和y是同一個對象值,返回ture,否則返回false
這個SameValueNonNumber操作說的就是,如果x,y兩個值類型相同,但又不同時是Number類型時的比較是否相等的操作。

上面有一部分是從外文翻譯的

總結

==和===的異同點:

比較雙方都是對象時,只有指向同一個對象才會相等(包含==/===)。

===要求比較雙方類型相同並且值相等。

==在比較雙方類型不同的時候通常會進行隱式類型轉換。

易於記憶的==比較的原則:

null==undefined, null/undefined不進行隱式類型轉換。

進行隱式類型或轉換時,優先轉換成Number型。

記住下面的例子:

onsole.log([10] == 10); //true
console.log('10' == 10); //true
console.log([] == 0); //true
console.log(true == 1); //true
console.log([] == false); //true
console.log(![] == false); //true
console.log('' == 0); //true
console.log('' == false); //true
console.log(null == false); //false
console.log(!null == true); //true
console.log(null == undefined); //true


分享到:


相關文章: