博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
typeof的原理?
阅读量:4841 次
发布时间:2019-06-11

本文共 1446 字,大约阅读时间需要 4 分钟。

javascript 中的 null:既是对象,又不是对象,史称「薛定谔的对象」。

typeof null === 'object';null instanceof Object === false

null instanceof null

会抛出异常:

Uncaught TypeError: Right-hand side of 'instanceof' is not an object

这是一个历史遗留下来的 feature(or bug?),

在 javascript 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:

  • 000:对象
  • 1:整数
  • 010:浮点数
  • 100:字符串
  • 110:布尔

有 2 个值比较特殊:

  • undefined:用 - (−2^30)表示。
  • null:对应机器码的 NULL 指针,一般是全零。

在第一版的 javascript 实现中,判断类型的代码是这么写的:

if (JSVAL_IS_VOID(v)) {  // (1)    type = JSTYPE_VOID;} else if (JSVAL_IS_OBJECT(v)) {  // (2) obj = JSVAL_TO_OBJECT(v); if (obj && (ops = obj->map->ops, ops == &js_ObjectOps ? (clasp = OBJ_GET_CLASS(cx, obj), clasp->call || clasp == &js_FunctionClass) // (3,4) : ops->call != 0)) { // (3) type = JSTYPE_FUNCTION; } else { type = JSTYPE_OBJECT; } } else if (JSVAL_IS_NUMBER(v)) { type = JSTYPE_NUMBER; } else if (JSVAL_IS_STRING(v)) { type = JSTYPE_STRING; } else if (JSVAL_IS_BOOLEAN(v)) { type = JSTYPE_BOOLEAN; }

(1):判断是否为 undefined

(2):如果不是 undefined,判断是否为对象
(3):如果不是对象,判断是否为数字
(4):。。。

这样一来,null 就出了一个 bug。根据 type tags 信息,低位是 000,因此 null 被判断成了一个对象。这就是为什么 typeof null 的返回值是 object

关于 null 的类型在 MDN 文档中也有简单的描述:

在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让 typeof null === 'null':typeof_null 但是该提议被无情的否决了,自此 typeof null 终于不再是一个 bug,而是一个 feature,并且永远不会被修复。


这是 JavaScript 最初实现的一个 bug,目前的 JavaScript 引擎已经不这么去实现了,但是这个 bug 却一直流传了下来。

至于对象的内部表示,不同的 JavaScript 引擎实现起来都是不一样的,单说说 V8 吧。

 (原文太长我就不贴过来了)

转载于:https://www.cnblogs.com/xuzishuai/p/9081944.html

你可能感兴趣的文章
Linux/Unix笔记本
查看>>
博弈问题之SG函数博弈小结
查看>>
数组排序 --- 庞果
查看>>
Cocos2d-x 处理双击事件的两种方法
查看>>
热键循环切换当前窗口为1/4、1/3、2/3屏幕大小
查看>>
用户权限管理
查看>>
30天敏捷生活(12): 整理你的空间
查看>>
纯虚函数
查看>>
Django与前端的交互
查看>>
线程安全总结
查看>>
Java获取正在执行的函数名
查看>>
vue 运行npm run dev报错
查看>>
HDU 1233 还是畅通工程
查看>>
HTTP状态码
查看>>
ArcEngine实现坐标转换和投影(转载)
查看>>
solr集群SolrCloud(solr+zookeeper)windows搭建
查看>>
LightOJ 1370 Bi-shoe and Phi-shoe(欧拉函数)
查看>>
51nod 1351 吃点心(贪心)
查看>>
Vim配置(python版)
查看>>
内核开发基础3——Linux内核配置与编译
查看>>