1+“2”如何实现
当 V8 执行 1+“2”时,因为这是两个原始值相加,原始值相加的时候,如果其中一项是字符串,那么 V8 会默认将另外一个值也转换为字符串
为什么呢?
Number(1).toString() +"2"
测试:
var obj = {
toString() {
return '200'
},
valueOf() {
return 100
}
}
obj + "3"
结果: 1003
原理:
优先执行对象内部valueOf,如没有valueOf再执行toString()
运行时环境
栈空间
存储数据的“引用”,例如:电视遥控器,存储遥控器
栈空间主要是用来管理 JavaScript 函数调用的,栈是内存中连续的一块空间,同时栈结构是“先进后出”的策略。
栈空间的最大的特点是空间连续,所以在栈中每个元素的地址都是固定的,因此栈空间的查找效率非常高,但是通常在内存中,很难分配到一块很大的连续空间,因此,V8 对栈空间的大小做了限制,如果函数调用层过深,那么 V8 就有可能抛出栈溢出的错误。
堆空间
存储引用的值,例如:电视遥控器,存储电视
如果有一些占用内存比较大的数据,或者不需要存储在连续空间中的数据,使用堆空间。 堆空间是一种树形的存储结构,用来存储对象类型的离散的数据,诸如函数、数组,在浏览器中还有 window 对象、document 对象等,这些都是存在堆空间的。
执行上下文
执行上下文中主要包含了三部分,变量环境、词法环境、和 this 关键字