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"里面说到的这个问题而耿耿于怀了!

javascript中的null,对象系统还是非对象系统?的更多相关文章

  1. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

  2. 区别Javascript中的Null与Undefined

    在JavaScript中存在这样两种原始类型:Null与Undefined.这两种类型常常会使JavaScript的开发人员产生疑惑,在什么时候是Null,什么时候又是Undefined? Undef ...

  3. JavaScript中对null和undefined的理解

    前沿: 今天工作中遇到了监视一个变量是undefined,结果判断写的是==null 返回值是true,这个结果引起了我对这两个东西的兴趣. 查询了相关的文章理解并测试了.发现有以下特点: 1.广义上 ...

  4. null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)

    null在关系运算中的坑 & 关系运算符的隐式转换问题 注意: 比较运算符 和 相等运算符 的 ECMAscript 语法实现不同. 比较运算符 和 相等运算符 对数据进行了隐式转换, 相当于 ...

  5. JavaScript中的 原型 property 构造函数 和实例对象之间的关系

    1 为什么要使用原型? /* * javascript当中 原型 prototype 对象 * * */ //首先引入 prototype的意义,为什么要使用这个对象 //先来写一个构造函数的面向对象 ...

  6. javascript中使用new与不使用实例化对象的区别

    我们先来看个实例 function Me(name,age,job){ this.name = name; this.age = age; this.job = job; } 请问这以下两种实例化对象 ...

  7. JavaScript中推断一个对象是否为&quot;空对象”

    JavaScript中推断一个对象是否为"空对象" 这里指的"空对象"是类似于:{ } 和 new Object() 这种. 详细的代码实现和原理例如以下: / ...

  8. Javascript中的null和 undefined

    Javascript Undefined vs NULL Many a times we often get confused on whats the difference between UNDE ...

  9. JavaScript中的Date,RegExp,Function对象

    Date对象 创建Date对象 //方法1:不指定参数var nowd1=new Date();alert(nowd1.toLocaleString( ));//方法2:参数为日期字符串var now ...

随机推荐

  1. cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)

    在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一 ...

  2. VBR与CBR的区别是什么?

    VBR是动态码率.CBR是静态码率. VBR(Variable Bitrate)动态比特率.也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率,这是以质量为前提兼顾文件大小的方 ...

  3. linux下面的fd限制

    如果不考虑内存大小的限制,在linux下面,fd (即file descriptor)的数量来自2个限制(阈值).其一:是操作系统的限制.这个限制主要是在linux内核中,我们知道,用户程序的fope ...

  4. Java获取某年某季度的第一天出错

    1.错误描述 Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given ...

  5. C#数据缓存介绍及Caching通用帮助类整理

    C#缓存主要是为了提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能. 以下为 ...

  6. systemd 编写服务管理脚本

    我们运行 linux 服务器的主要目的是通过运行程序提供服务,比如 mysql.web server等.因此管理 linux 服务器主要工作就是配置并管理上面运行的各种服务程序.在 linux 系统中 ...

  7. freemarker获取封装类中对象的属性(六)

    freemarker获取封装类中对象的属性 1.设计思路 (1)封装学生类 (2)创建数据模型 (3)新建student.ftl (4)运行Junit测试文件,生成HTML文件 2.封装学生类 Stu ...

  8. 爬数据,能让你少写1000行代码的捷径! | Python 正则表达式

    ▌春暖花开,又到了出门游玩拍拍拍吃吃吃的好季节了! 说到拍照摄影,你会构图吗?就是在照片有限的空间内处理人.景.物的关系,并将三者安排在画面中最佳的位置,以形成画面特定结构的方法. 学院君就是一个「拍 ...

  9. java继承方法规则或规律

    方法的继承与属性的继承有很大的不同,属性任何继承方式均可,而方法则有各种限制,于是在这里做了一个简单的总结: 1.修饰符相同的方法覆盖,即只改内部,不改外部 2.访问权限不同的方法覆盖,子类只能相对父 ...

  10. MySQL配置文件

    [mysqld]datadir=/usr/local//mysql/data    #数据存放位置socket=/var/lib/mysql/mysql.sockuser=mysqllower_cas ...