第三篇《Google V8 原理》之【 1+“2”】如何实现和运行时环境堆栈

113 阅读1分钟

1+“2”如何实现

当 V8 执行 1+“2”时,因为这是两个原始值相加,原始值相加的时候,如果其中一项是字符串,那么 V8 会默认将另外一个值也转换为字符串

为什么呢?

Number(1).toString() +"2"

测试:

var obj = {
    toString() {
        return '200'
    },
    valueOf() {
        return 100
    }
}
obj + "3" 

结果: 1003

原理:

优先执行对象内部valueOf,如没有valueOf再执行toString()

image.png

运行时环境

栈空间

存储数据的“引用”,例如:电视遥控器,存储遥控器

栈空间主要是用来管理 JavaScript 函数调用的,栈是内存中连续的一块空间,同时栈结构是“先进后出”的策略

栈空间的最大的特点是空间连续,所以在栈中每个元素的地址都是固定的,因此栈空间的查找效率非常高,但是通常在内存中,很难分配到一块很大的连续空间,因此,V8 对栈空间的大小做了限制,如果函数调用层过深,那么 V8 就有可能抛出栈溢出的错误。

堆空间

存储引用的值,例如:电视遥控器,存储电视

如果有一些占用内存比较大的数据,或者不需要存储在连续空间中的数据,使用堆空间。 堆空间是一种树形的存储结构,用来存储对象类型的离散的数据,诸如函数、数组,在浏览器中还有 window 对象、document 对象等,这些都是存在堆空间的。

执行上下文

image.png

执行上下文中主要包含了三部分,变量环境、词法环境、和 this 关键字