我们都知道 typeof(null) === 'object'
,关于原因,在小黄书《你不知道的JavaScript》中有这么一段解释:
原理是这样的, 不同的对象在底层都表示为二进制, 在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型, null 的二进制表示是全 0, 自然前三位也是 0, 所以执行 typeof 时会返回“object”。
我就想问下,不同的对象对应的二进制数是多少位的,具体值又是多少?比如String类型的二进制表示是多少?
我们都知道 typeof(null) === 'object'
,关于原因,在小黄书《你不知道的JavaScript》中有这么一段解释:
原理是这样的, 不同的对象在底层都表示为二进制, 在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型, null 的二进制表示是全 0, 自然前三位也是 0, 所以执行 typeof 时会返回“object”。
我就想问下,不同的对象对应的二进制数是多少位的,具体值又是多少?比如String类型的二进制表示是多少?
这有撒子好研究的~ 因为js是弱语言类型 所有的变量定义都是松散型
可以是基础类型String Boolean Number Null undefind
也可以是引用型,,,并且在计算过程中 相互转化,,
所以就有了typeof 来检测变量的类型!
8 回答4.9k 阅读✓ 已解决
6 回答3.6k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.5k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
并不完全正确。
我在知乎 有哪些明明是 bug,却被说成是 feature 的例子? 有介绍过。
javascript 中的
null
:既是对象,又不是对象,史称「薛定谔的对象」。而
会抛出异常:
这是一个历史遗留下来的 feature(or bug?),The history of “typeof null”
在 javascript 的最初版本中,使用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息:
有 2 个值比较特殊:
在第一版的 javascript 实现中,判断类型的代码是这么写的:
(1):判断是否为 undefined
(2):如果不是 undefined,判断是否为对象
(3):如果不是对象,判断是否为数字
(4):。。。
这样一来,
null
就出了一个 bug。根据 type tags 信息,低位是000
,因此null
被判断成了一个对象。这就是为什么typeof null
的返回值是object
。关于
null
的类型在 MDN 文档中也有简单的描述:typeof - javascript | MDN在 ES6 中曾有关于修复此 bug 的提议,提议中称应该让
typeof null === 'null'
http://wiki.ecmascript.org/do...:typeof_null 但是该提议被无情的否决了,自此typeof null
终于不再是一个 bug,而是一个 feature,并且永远不会被修复。这是 JavaScript 最初实现的一个 bug,目前的 JavaScript 引擎已经不这么去实现了,但是这个 bug 却一直流传了下来。
至于对象的内部表示,不同的 JavaScript 引擎实现起来都是不一样的,单说说 V8 吧。
v8引擎是如何知道js数据类型的? (原文太长我就不贴过来了)