typeof引发的思考
前情提要
因为要给20级科协成员讲课,于是回过头看红宝书。看到typeof是发现了很多有意思的事情
typeof null
// 返回 object
typeof undefined
// 返回 undefined
疑惑1
看到这,大家我们首先会疑惑,为什么null返回的结果是个object类型
这可以从来两个角度去解释
-
从逻辑角度,null值表示一个空对象指针,也正是会返回object的原因
-
需要先了解一下JavaScript基本数据类型存储规则
大家都知道 “typeof null” 的 bug,它是在 JavaScript 的第一版就存在的。在这个版本中,值以 32 位的单位存储,包括一个小型类型标记(1-3 位)和值的实际数据。类型标记存储在单元的较低位上。一共有 5 种类型:
000: object,表示这个数据是一个对象的引用。
1: int,表示这个数据是一个 31 位的有符号整型。
010: double,表示这个数据是一个双精度浮点数的引用。
100: string,表示这个数据是一个字符串的引用。
110: boolean,表示这个数据是一个布尔值。
恰巧,null的类型标记和对象类型相同,这也就是出现这样结果的根本原因
实质上null 有属于自己的类型 Null,而不属于Object类型,其实,我们可以通过另一种方法获取 null 的真实类型:
Object.prototype.toString.call(null) ; // [object Null]
疑惑2
既然null和undefined本质不一样,那么为什么会出现null==undefined
返回true
的现象呢
解释1:
有文章对此进行了解释,大致是下面的意思:undefined的布尔值是false,null的布尔值也是false,所以它们在比较时都转化为了false,所以 undefined == null
但是他是错误的
解释2:
可以从Javascript规范中找到答案:
规范中提到, 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值,并且规定null 和 undefined 是相等的。
null 和 undefined都代表着无效的值
说白了,就是个bug硬性规定,无需过分纠结,日后避免使用即可,推荐使用不含type conversion
的triple equals operator