天天看點

在 JavaScript 中為什麼 typeof null 的結果是 object?

java 中的 null:既是對象,又不是對象,史稱「薛定谔的對象」。

  1. typeof null==='object';  、、//true
  2. null instanceof Object    //false
  3. nullinstanceofObject===false

  1. null instanceof null

會抛出異常:

  1. UncaughtTypeError:Right-hand side of 'instanceof'isnotan object

這是一個曆史遺留下來的 feature(or bug?),The history of “typeof null”

在 java 的最初版本中,使用的 32 位系統,為了性能考慮使用低位存儲了變量的類型資訊:

  • 000:對象
  • 1:整數
  • 010:浮點數
  • 100:字元串
  • 110:布爾

有 2 個值比較特殊:

  • undefined:用 -2^{30} (−2^30)表示。
  • null:對應機器碼的 NULL指針,一般是全零。

在第一版的 java 實作中,判斷類型的代碼是這麼寫的:

  1. if(JSVAL_IS_VOID(v)){// (1)
  2. type =JSTYPE_VOID;
  3. }elseif(JSVAL_IS_OBJECT(v)){// (2)
  4. obj =JSVAL_TO_OBJECT(v);
  5. if(obj &&
  6. (ops =obj->map->ops,
  7. ops ==&js_ObjectOps
  8. ?(clasp =OBJ_GET_CLASS(cx,obj),
  9. clasp->call ||clasp ==&js_FunctionClass)// (3,4)
  10. :ops->call !=0)){// (3)
  11. type =JSTYPE_FUNCTION;
  12. }else{
  13. type =JSTYPE_OBJECT;
  14. }
  15. }elseif(JSVAL_IS_NUMBER(v)){
  16. type =JSTYPE_NUMBER;
  17. }elseif(JSVAL_IS_STRING(v)){
  18. type =JSTYPE_STRING;
  19. }elseif(JSVAL_IS_BOOLEAN(v)){
  20. type =JSTYPE_BOOLEAN;
  21. }

java

(1):判斷是否為 undefined

(2):如果不是 undefined,判斷是否為對象

(3):如果不是對象,判斷是否為數字

(4):。。。

這樣一來, null就出了一個 bug。根據 type tags 資訊,低位是 000,是以 null被判斷成了一個對象。這就是為什麼 typeofnull的傳回值是 "object"。

關于 null的類型在 MDN 文檔中也有簡單的描述:typeof - java | MDN

在 ES6 中曾有關于修複此 bug 的提議,提議中稱應該讓 typeofnull==='null'http://wiki.ecma.org/doku.php?id=harmony:typeof_null 但是該提議被無情的否決了,自此 typeofnull終于不再是一個 bug,而是一個 feature,并且永遠不會被修複。傳回搜狐,檢視更多

轉載于:https://www.cnblogs.com/chargeworld/p/10387195.html