在 JavaScript 中为什么 typeof null 的结果是 object?
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,并且永远不会被修复。返回搜狐,查看更多
最新文章
- mybatis 对于基本类型数据传值的问题
- JBoss AS7 快速配置
- Linux学习一周初体验
- linux centos 6.5 运行MySQL Workbench 6.0找不到 libmysqlclient.so.16和libmysqlclient_r.so.16
- angular之控制器(0)
- NHibernate系列文章十九:NHibernate关系之多对多关系(附程序下载)
- [Java基础] System.arraycopy使用
- EXT layout
- AMQ学习笔记 - 05. 客户端模板化
- Oracle RAC 11gR2 修改本地及SCAN监听端口
- 绝对URL和相对URL
- Yii2 TimestampBehavior行为
- Js之History对象
- T4模板之菜菜鸟篇
- 课堂博客-----TreeView+++++XML形成博客
- fetch请求get方式以及post提交参数为formdata类型的数据
- 接口由40秒到200ms优化记录
- [转载]Linux 16进制查看命令、工具
- 【转载】 Deepmind星际争霸2平台使用第一轮-完成采矿
- Java_EE面试题