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

最新文章

  1. mybatis 对于基本类型数据传值的问题
  2. JBoss AS7 快速配置
  3. Linux学习一周初体验
  4. linux centos 6.5 运行MySQL Workbench 6.0找不到 libmysqlclient.so.16和libmysqlclient_r.so.16
  5. angular之控制器(0)
  6. NHibernate系列文章十九:NHibernate关系之多对多关系(附程序下载)
  7. [Java基础] System.arraycopy使用
  8. EXT layout
  9. AMQ学习笔记 - 05. 客户端模板化
  10. Oracle RAC 11gR2 修改本地及SCAN监听端口
  11. 绝对URL和相对URL
  12. Yii2 TimestampBehavior行为
  13. Js之History对象
  14. T4模板之菜菜鸟篇
  15. 课堂博客-----TreeView+++++XML形成博客
  16. fetch请求get方式以及post提交参数为formdata类型的数据
  17. 接口由40秒到200ms优化记录
  18. [转载]Linux 16进制查看命令、工具
  19. 【转载】 Deepmind星际争霸2平台使用第一轮-完成采矿
  20. Java_EE面试题

热门文章

  1. windows下web端测试环境搭建(tomcat+oracle)
  2. install multiple versions of CUDA
  3. MAT(memory anlayzer tool)使用方法
  4. C#接口与抽象类学习笔记
  5. 报表平台需求文档(V0.0.0.1)
  6. 关于Django图片上传
  7. Java基本语法--控制台输入(Scanner类)
  8. 巨杉TechDay回顾 | WARNING!您参加的数据库沙龙热度已爆表……
  9. Python中super的用法【转载】
  10. 动图演示23个鲜为人知的VSCode快捷键