JS型別(一) 深入討論「 」與「 」

2021-09-14 07:56:58 字數 3121 閱讀 7844

寫前端**的乙個避不開的問題:「==」 「===」到底是怎麼回事?

下面是大眾的理解:

1. "=="指的是數值的相等。即使型別不一致,轉化後的值相等,還是返回true

2. "==="指的是型別和數值都相等,如果型別不一致就直接呵呵了

然而記住了這些並沒有什麼用,上面的說法太不具體了,該出錯的時候還是會出錯。

1.「==」是怎麼回事?

0 == null
上面的表示式返回true還是false??

在讀懂規格上,下面是演算法細節。

returnifabrupt(x).

returnifabrupt(y).

if type(x) is the same as type(y), then

return the result of performing strict equality comparison x === y.

if x is null and y is undefined, return true.

if x is undefined and y is null, return true.

if type(x) is number and type(y) is string,

return the result of the comparison x == tonumber(y).

if type(x) is string and type(y) is number,

return the result of the comparison tonumber(x) == y.

if type(x) is boolean, return the result of the comparison tonumber(x) == y.

if type(y) is boolean, return the result of the comparison x == tonumber(y).

if type(x) is either string, number, or symbol and type(y) is object, then

return the result of the comparison x == toprimitive(y).

if type(x) is object and type(y) is either string, number, or symbol, then

return the result of the comparison toprimitive(x) == y.

return false.

上面這段演算法,一共有12步,翻譯如下。

如果x不是正常值(比如丟擲乙個錯誤),中斷執行。

如果y不是正常值,中斷執行。

如果type(x)與type(y)相同,執行嚴格相等運算x === y。

如果x是null,y是undefined,返回true。

如果x是undefined,y是null,返回true。

如果type(x)是數值,type(y)是字串,返回x == tonumber(y)的結果。

如果type(x)是字串,type(y)是數值,返回tonumber(x) == y的結果。

如果type(x)是布林值,返回tonumber(x) == y的結果。

如果type(y)是布林值,返回x == tonumber(y)的結果。

如果type(x)是字串或數值或symbol值,type(y)是物件,返回x == toprimitive(y)的結果。

如果type(x)是物件,type(y)是字串或數值或symbol值,返回toprimitive(x) == y的結果。

返回false。

引用mdn上的一張圖就是:

由於0的型別是數值,null的型別是null(這是規格4.3.13小節的規定,是內部type運算的結果,跟typeof運算子無關)。因此上面的前11步都得不到結果,要到第12步才能得到false。

0 == null // false
上面12條規則,對於「==」部分可以用一張圖的總結:

前面說得很亂,根據我們得到的最終的圖3,我們總結一下==運算的規則:

對這張圖的詳細介紹可以檢視文章:

2.「===」又是怎麼回事?

這個比較簡單了,"==="是嚴格意義上的相等,必須要了型別和值都相等才返回true,否則返回false。所以在判斷的時候比較容易就能看出來(一模一樣才是true)。

比較是否相等有三種方法:

=== 嚴格的相等

== 寬鬆的相等

object.is

一張**來說明它們之間的區別:

這裡主要注意nan 、 -0 +0這兩對表現得不一致情況。

1.物件({}或者非空物件)轉基本型別返回"[object object]"

const obj = {};

obj.tostring();//"[object object]"

obj.name='name';

obj.tostring();//"[object object]"

2.陣列轉基本型別,返回陣列元素合集組成的字串,每個元素用","連線

.tostring();//""

[1,2].tostring();//"1,2"

[[1,2],3].tonstring();//"1,2,3"

JS的變數與資料型別 JS一

js 執行在瀏覽器上的動態語言 核心中有兩個引擎 渲染引擎 js引擎 js是解釋型語言 一行一行執行,插入一句話 編譯型是先編譯,然後整體執行 js是單執行緒 單執行緒非同步 node.js用js搭建的伺服器 ecma 歐洲計算機聯盟 js核心3部分 ecma 標準核心 dom document o...

js深入淺出 型別轉換

隱式轉換 1.是賦值 2.嚴格模式 先判斷型別,再判斷值 console.log 123 123 false console.log null undefined false console.log undefined undefined true 3.如圖 2.一邊是數值,一邊是字串,字串會轉數值...

js深入理解 一

1if a b 兩者等價 a b alert hello word 2.給eval取別名var a 111 var b eval var c b a alert c 輸出 111 3.刪除元素 不能刪除 var語句宣告的變數 var o delete o.x alert o.x 輸出 undefin...