JavaScript ==原理與分析

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大力