1. 一直以来的认知
在我学习 js 的过程中, 爱民老师的绿皮书里将 js 的类型系统分成了两类:
其一是元类型系统: 由 typeof 运算来检测
其二是对象类型系统: 是元类型的 object 的一个分支
而 null 这个关键字也被归类到了对象类型系统里面了:
是属于对象系统的
对象是空值
所以, 当我们使用 typeof 去考察 Null 的话, 会返回给我们 "object"
如果去用 for(... in null)的方式试图去枚举 Null 里面的属性的时候 ES5 会先行判断 null 和 undefined, 如果是这两个值的话, 不会去执行循环体
而我认为这一切都是 null 既无属性也无方法导致的而且 null 也并无原型, 也并不是 Object()构造器或者其子类实例而来的
而我是 c# 出身的前端, 我觉得将 null 归类到对象系统里面是一个不错的选择!
2. 你不知道的 js 里面怎么说的?
当我看到第三章的对象的时候, 里面有这样一段话
null 有时会被当作一种对象类型, 但是这其实只是语言本身的一个 bug, 即对 null 执行
typeof null 时会返回字符串 "object" 实际上, null 本身是基本类型
看到这里, 完全颠覆我的认知啊!
按照 u dot know 里面的划分的话其实也是书里面很常见的一种划分方式高程 3 中就是这样来划分 js 的类型系统的但是, 因为我觉得爱民老师这样的划分方式也没什么不妥一切都是看待问题的角度不同导致的而爱民老师将 null 归类到对象类型里面去, 因为在 js 中除了 undefined 之外的都是对象
而 u dot know 直接耳提面命的告诉我: 你一直理解的 js 类型系统, 是错的!
//'u dot kown'里的注解
注 1: 原理是这样的, 不同的对象在底层都表示为二进制, 在 JavaScript 中二进制前三位都为 0 的话会被判
断为 object 类型, null 的二进制表示是全 0, 自然前三位也是 0, 所以执行 typeof 时会返回 object
3. 到底怎么理解?
因为有了疑虑, 所以我们要去探查真相!
终于, 贺老给了我们一个很好的回答!
hax 主要说了以下几个点:
爱民老师是按照自己的理解来分类的, 而不是按照 ECMA 来照本宣科的, 况且他写书的时候 ES5/ES6 还没有出来, 而 ES5 之前的 ES 规范其实都写得比较烂
现在比较普遍的认知是, typeof null 返回 object 是一个历史错误(JS 的发明者 Brendan Eich 自己也是这样说的), 只是因为要保持语言的兼容性而维持至今从 ES5 制定开始就有动议将 typeof null 改为返回 null(如启动 node 加上 --harmony_typeof 参数, 即是如此), 但是当前 ES6 标准草案仍然维持了原样
按照爱民的意见, 也可在某种程度上理解为 null 实为 object 类型的一个特殊值在诸如 Java 这样的语言中, 一个变量若是 primitive 类型, 均不可赋以 null 值, 而若是 object, 则均可赋以 null 值因为在理解上来说, null 实际是引用 (reference) 的特殊值(表示没有指向任何实际对象)
ECMA 是如何划分概念, 主要是依据 ECMA 的逻辑, 而不是其他标准所以从 ECMA 的逻辑看, 类型系统是这样划分的, 也是合理的
4. 结论
古人常云: 尽信书不如无书书中的知识也是作者按照自己对语言了解的深度和他自己涉猎的广度的一个综合的体现
而我们看书, 其实就是和作者交流的过程
所以, 你说爱民老师说的对吗?
对也不对! 狭义的看, 如果按照 ECMA 来说, 就不对但是, 广义的看, 如果你觉得按照爱民老师的划分, 让你对 js 的类型系统保持了你对对象一贯的理解, 那就是对的
那你说, ECMA 是对的吗?
对也不对! 狭义的看, 标准一般都是对的但是, 广义的看, 如果你觉得把 null 不归为对象系统, 不符合你对高级语言的认知, 那也可以说是不对
那么, 回到我这篇文章的标题, js 中的 null, 你觉得是对象吗?
我可能并不会去正面回答我提出的问题了, 但是, 我想说的是, 至少我现在并不会对于 "u dot know" 里面说到的这个问题而耿耿于怀了!
来源: https://www.cnblogs.com/ChengWuyi/p/8648164.html