JavaScript ==原理與分析

瘋狂馬鈴薯發表於2022-02-23

JavaScript原始型別

ECMAScript 有 5 種原始型別(primitive type),即 Undefined、Null、Boolean、Number 和 String。

typeof 運算子

typeof 運算子有一個引數,即要檢查的變數或值。例如:

var sTemp = "test string";
alert (typeof sTemp);    //輸出 "string"
alert (typeof 86);    //輸出 "number"

對變數或值呼叫 typeof 運算子將返回下列值之一:

  • undefined - 如果變數是 Undefined 型別的

  • boolean - 如果變數是 Boolean 型別的

  • number - 如果變數是 Number 型別的

  • string - 如果變數是 String 型別的

  • object - 如果變數是一種引用型別或 Null 型別的

註釋:您也許會問,為什麼 typeof 運算子對於 null 值會返回 "Object"。這實際上是 JavaScript 最初實現中的一個錯誤,然後被 ECMAScript 沿用了。現在,null 被認為是物件的佔位符,從而解釋了這一矛盾,但從技術上來說,它仍然是原始值。

JavaScript引用型別

對於引用型別,眾說紛紜。

從網路上總結的暫時有Object、Boolean、Number、String、Date、Array、Function。

==核心原理

知乎大佬manxisuo對於原理進行的全面解析,核心就是型別轉換

先說轉換結果:

  • undefined == null,結果是true。且它倆與所有其他值比較的結果都是false

  • String == Boolean,需要兩個運算元同時轉為Number。

  • String/Boolean == Number,需要String/Boolean轉為Number。

  • Object == Primitive,需要Object轉為Primitive(具體通過valueOftoString方法)。

核心關注引用型別Object轉換原始型別(primitive type)

引用型別中的valueOf與toString方法,可以進行重寫,類似如下

var obj = {valueOf: function(){ return {} }, toString: function(){ return {}}}

console.log(obj);
console.log(obj.toString());
console.log(obj.valueOf());
console.log(typeof obj);

{valueOf: ƒ, toString: ƒ}
{}
{}
object

對於上方obj通過valueOf與toString方法後,最後獲得結果為{},而{}這個結果是無法轉換為原始型別的。

總結

知乎大佬Belleve、知乎大佬manxisuo進行了如下總結。

轉換總結

雙等比較

全等比較

完整比較

  • 紅色:===
  • 橙色:==
  • 黃色:<= 和 >= 同時成立,== 不成立
  • 藍色:只有 >=
  • 綠色:只有 <=

巨人的肩膀

一張圖徹底搞懂JavaScript的==運算 - 知乎 (zhihu.com)

(79 條訊息) Javascript 中 == 和 === 區別是什麼? - 知乎 (zhihu.com)

JavaScript引用型別之Array陣列的toString()和valueof()方法的區別 - 鄭小超 - 部落格園 (cnblogs.com)

ECMAScript 原始型別 (w3school.com.cn)

ECMAScript 引用型別 (w3school.com.cn)

“一天不學習,我渾身難受” -X大力

相關文章