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,并且永远不会被修复。返回搜狐,查看更多