java 中的 null:既是對象,又不是對象,史稱「薛定諤的對象」。
-
typeof null==='object'; 、、//true
-
null instanceof Object //false
-
nullinstanceofObject===false
而
-
null instanceof null
會拋出異常:
-
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 實現中,判斷類型的代碼是這么寫的:
-
if(JSVAL_IS_VOID(v)){// (1)
-
type =JSTYPE_VOID;
-
}elseif(JSVAL_IS_OBJECT(v)){// (2)
-
obj =JSVAL_TO_OBJECT(v);
-
if(obj &&
-
(ops =obj->map->ops,
-
ops ==&js_ObjectOps
-
?(clasp =OBJ_GET_CLASS(cx,obj),
-
clasp->call ||clasp ==&js_FunctionClass)// (3,4)
-
:ops->call !=0)){// (3)
-
type =JSTYPE_FUNCTION;
-
}else{
-
type =JSTYPE_OBJECT;
-
}
-
}elseif(JSVAL_IS_NUMBER(v)){
-
type =JSTYPE_NUMBER;
-
}elseif(JSVAL_IS_STRING(v)){
-
type =JSTYPE_STRING;
-
}elseif(JSVAL_IS_BOOLEAN(v)){
-
type =JSTYPE_BOOLEAN;
-
}
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,並且永遠不會被修復。返回搜狐,查看更多