为啥 `var a = "..."` 比 `var a = new String("...")` 快?

Posted

技术标签:

【中文标题】为啥 `var a = "..."` 比 `var a = new String("...")` 快?【英文标题】:Why `var a = "..."` is faster than `var a = new String("...")`?为什么 `var a = "..."` 比 `var a = new String("...")` 快? 【发布时间】:2019-06-20 12:52:49 【问题描述】:

我正在尝试了解 javascript 的工作原理。分析一些代码,我发现以“类型化”为导向的声明比非“类型化”的声明慢。当然,我知道 JS 不是类型化语言。

我在 Firefox、Chrome 和 Opera 上对此进行了测试,结果始终相同。

var repetitions = 10000000;

console.time("a");
for (var i=0; i<repetitions; i++) 
    var a = "...";

console.timeEnd("a");

console.time("b");
for (var i=0; i<repetitions; i++) 
    var b = new String("...");

console.timeEnd("b")

【问题讨论】:

这取决于底层引擎实现,每个浏览器/平台可能不同。你试过什么平台?您是否将其与其他平台进行了比较?你能说这种现象普遍存在吗? toSource 被标记为非标准。即使它显示了您所说的内容,也没有理由相信解析器正在为两者执行相同的步骤。使用 new 比分配文字有更多的开销。但是,不能保证在某些实现上会更快/更慢。我看不出详细讨论这个问题的好处。 我在 Firefox、Chrome 和 Opera 上对此进行了测试,结果始终相同。 【参考方案1】:

特别是在 V8 中,如果您检查生成的字节码 (node --print-bytecode),您会得到如下信息:

> return "..."

LdaConstant [0]
Return 

> return new String("...")

LdaGlobal [0], [0]
Star r0
LdaConstant [1]
Star r1
Ldar r0
Construct r0, r1-r1, [2]
Return 

这基本上意味着字符串文字只是从常量池中加载指针,而new String 涉及更多步骤——加载全局String 对象,加载常量,调用通用Construct 方法。我猜在 FF 或任何其他引擎中情况并没有太大的不同。

【讨论】:

以上是关于为啥 `var a = "..."` 比 `var a = new String("...")` 快?的主要内容,如果未能解决你的问题,请参考以下文章

JS中var为啥会储存多个值?

java-fastJson:请问下面代码有啥错?为啥打印出来后numString始终为空呢?

简单类连接

android button为啥会用阴影

shell 判断字符串是不是存在包含关系

为啥bootstrap没有效果