📅  最后修改于: 2023-12-03 15:06:16.298000             🧑  作者: Mango
在 JavaScript 中,+ 运算符既可以作为加法运算符,也可以作为字符串拼接运算符。为了区分这两种情况,当 + 运算符的其中一个操作数为字符串时,JavaScript 引擎会把另一个操作数隐式转换为字符串,然后进行字符串拼接;否则,会进行数字加法运算。
在早期的 JavaScript 引擎中,对于 {} + {} 这样的表达式,由于两个操作数都不是字符串,因此会进行加法运算,但对象不能直接相加,因此会将它们隐式转换为数字,最终返回 NaN。这就是为什么这个表达式在早期版本的 Chrome 控制台中会返回 NaN。
然而,在现代的 JavaScript 引擎中,出于性能考虑,当一个表达式的结构可以被静态确定时,引擎会对它进行优化,以加速代码的执行。例如,对于常量表达式,引擎会在编译阶段就计算出它们的值,并将结果保存在代码中,避免重复计算。这种优化称为常量折叠(Constant Folding)。
在目前的 Chrome 浏览器中,{} + {} 这个表达式被优化为一个普通的对象字面量,即两个空对象相加得到一个新的空对象。因此,它的返回值不再是 NaN,而是一个空对象,即 {}。
以下是在 Chrome 控制台中执行的示例代码和结果:
> {} + {}
{}
需要注意的是,这种优化只发生在处理常量表达式时,如果表达式中包含变量或函数调用等动态元素,优化器将不会生效,这时表达式的行为会像以前一样。因此,建议在编写 JavaScript 代码时注意避免使用类似于 {} + {} 这样的难以理解的表达式,以免造成不必要的困扰。