再探JS---typeof引发的思考

typeof引发的思考

前情提要

因为要给20级科协成员讲课,于是回过头看红宝书。看到typeof是发现了很多有意思的事情

typeof null 
// 返回 object
typeof undefined
// 返回 undefined

疑惑1

看到这,大家我们首先会疑惑,为什么null返回的结果是个object类型

这可以从来两个角度去解释

  1. 从逻辑角度,null值表示一个空对象指针,也正是会返回object的原因

  2. 需要先了解一下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 conversiontriple equals operator

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值