v8引擎是如何知道js数据类型的？
V8 类型继承图：  而完整的 C++ Class 继承图要比这个复杂的多，V8 的类型定义在 https://github.com/v8/v8/blob/master/src/objects.h 文件中: 最上面的是 Object：Object有两个子类 SMI 和 HeapObject。 SMI 的意思就是 Small Integer 的缩写，SMI 对应这 Int31（32位系统是 Int30）。 V8 使用了一个技巧“tagged pointers”来区分这个变量是一个 SIM，还是 HeapObject 。 比如，这段 SMI 代码：（为了提示性能，V8 使用了 C++ 的很多位运算和宏） kSmiTag 定义了 SMI 的标记，值为 0。 kSmiTagSize 定义了标记位的长度，为 0。 在调用 IntToSmi 之前，首先要判断这是值是否为 Smi，如果把一个字符串存储为 Smi 那么肯定会得到错误的结果： 32 位系统的 IsValidSmi： 64 位系统的 IsValidSmi： 一个数如果是 Smi，那么就把这个数左移 1 位，然后和 kSmiTag 进行“按位或”运算。也就是说，我们定义 let num = 100; 其实 V8 内部并没有把这个数存储为 100。 当 V8 运行的时候，从内存中取到值，首先要判断这个值到底是什么？代码如下： 如果是 Smi 则把这个值转换为 Int32： 32位系统: 64位系统： 就是上面操作的逆运算：直接向右移位。 通过我之前做的一个基准测试也说明了 32 位系统和 64 位系统是不同的： 如果不是 SMI，那就是 HeapObject。关于 V8 Object 内部表示的文章已经非常多了，可以搜一下。 我在专栏也写过一篇：开启 V8 对象属性的“fast”模式