在 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,並且永遠不會被修復。返回搜狐,查看更多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM