JavaScript中typeof原理探究？
我们都知道 `typeof(null) === 'object'`，关于原因，在小黄书《你不知道的JavaScript》中有这么一段解释：
原理是这样的， 不同的对象在底层都表示为二进制， 在 JavaScript 中二进制前三位都为 0 的话会被判断为 object 类型， null 的二进制表示是全 0， 自然前三位也是 0， 所以执行 typeof 时会返回“object”。
我就想问下，不同的对象对应的二进制数是多少位的，具体值又是多少？比如String类型的二进制表示是多少？
并不完全正确。
我在知乎 有哪些明明是 bug，却被说成是 feature 的例子？ 有介绍过。
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?)，The history of “typeof null”
在 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 文档中也有简单的描述：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数据类型的？ （原文太长我就不贴过来了）