JS 寬鬆等價 的5條簡單規則

2021-09-11 08:57:42 字數 1833 閱讀 9336

1. number與string進行比較時,將string型別轉化為number。

2. boolean與任何型別進行比較時,將boolean型別轉化為number。

3. null與undefined進行比較時,返回true。

4. object與非object進行比較時,將object型別轉化為基礎型別

(呼叫valueof,如果沒有得到基礎型別那麼繼續呼叫tostring,直至得到基礎型別中一項為止)

複製**

關於物件轉化為基礎值參考

為了轉換為基本型別值的等價物,toprimitive 抽象操作(es5 語言規範,9.1 部分)將會查詢這個值(使用內部的 defaultvalue 操作 —— es5 語言規範,8.12.8 部分),看它有沒有 valueof() 方法。如果 valueof() 可用並且它返回乙個基本型別值,那麼 這個 值就將用於強制轉換。如果不是這樣,但 tostring() 可用,那麼就由它來提供用於強制轉換的值。

如果這兩種操作都沒提供乙個基本型別值,就會丟擲乙個 typeerror。 以下乙個例子列表,摘抄於書,可以增加對上述規則的熟練度

"0" == null;			// false

"0" == undefined; // false

"0" == false; // true --false轉化為0(第2條規則),然後"0"被轉化為0(第一條規則),返回true

"0" == nan; // false

"0" == 0; // true

"0" == ""; // false

false == null; // false

false == undefined; // false

false == nan; // false

false == 0; // true

false == ""; // true

false == ; // true

false == {}; // false

"" == null; // false

"" == undefined; // false

"" == nan; // false

"" == 0; // true

"" == ; // true

"" == {}; // false

0 == null; // false

0 == undefined; // false

0 == nan; // false

0 == ; // true

0 == {}; // false

複製**

算是複習,快過年了閒來無事重讀you-dont-know-js,相比一年之前的第一次粗讀大不一樣,果然書讀百遍其義自見這話是有幾分道理的。

ps:遇到乙個小疑問,如果有大神能解答不勝感激

將a + ""這種 隱含的 強制轉換與我們早先的string(a)明確的 強制轉換的例子相比較,有乙個另外的需要小心的奇怪之處。由於toprimitive抽象操作的工作方式,a + ""在值a上呼叫valueof(),它的返回值再最終通過內部的tostring抽象操作轉換為乙個string。但是string(a)只直接呼叫tostring()。

怎麼驗證在valueof返回非基礎型別的情況下tostring是對valueof的返回值進行加工,tostring操作是怎麼拿到vauleof的返回值,或者我理解有誤?tostring並不等同於tostring...

寫好 JS 條件語句的 5 條守則

總結 1.多重判斷時使用 array.includes function test fruit 2.更少的巢狀,盡早 return 3.使用預設引數和解構 解構 僅僅獲取 name 屬性 為其賦預設值為空物件 function test test results test undefined unk...

js中的DOM 簡解

二 eventtarget 介面 三 node 的介面 2 node的方法 四 document 介面 五 element 介面 其他一 前提概念理解 1.doctype 一般我們說的dom預設是指html document。部分人就會以為document文件,指的就是html文件。事實上不正確的。...

簡說JS中的instanceof

instanceof操作符在mdn上的解釋為 定義instanceof運算子用於測試建構函式的prototype屬性是否出現在物件的原型鏈的任何位置。1 作用 判斷乙個引用是否屬於某建構函式或在繼承關係中判斷乙個例項是否屬於他的父型別。2 判斷邏輯 從當前引用的proto一層一層順著原型鏈往上找,看...