为什么连接空字符比 .toString() 更快?

Afs*_*ani 5 javascript algorithm optimization performance

我有这个代码:

var boo = 123123;
Run Code Online (Sandbox Code Playgroud)

我想将该数字转换为字符串,并且conact string比本机 JavaScript .toString()更快:

快点

var foo = boo + ""; 
Run Code Online (Sandbox Code Playgroud)

慢点

var foo = boo.toString(); 
Run Code Online (Sandbox Code Playgroud)

jsPerf: http: //jsperf.com/concat-string-vs-tostring

为什么.toString()比连接空字符慢?最后我想知道使用+ ""技术而不是正确的方法是什么.toString()

Pet*_*iuk 5

结果会因使用的 JavaScript 引擎而异。在 chrome one 上,我得到了与 Afshin 相同的结果。

那么为什么实际上一个比另一个慢呢?这是因为toStringV8内部将会多一个对C函数的调用。接下来你可以自己尝试看看:

  • 在 Chrome 中打开空选项卡(以避免已打开的页面产生任何副作用)
  • 开放开发者工具
  • 打开“配置文件”选项卡并开始新的配置文件
  • 转到控制台选项卡并插入script1脚本,然后按 Enter 键。
  • 再次转到配置文件并停止配置文件
  • 重复同样的操作script2

  • 脚本1:var boo = 123123; var foo = boo + "";

  • 脚本2:var boo = 123123; var foo = boo.toString();

就我而言,首先将导致下一个堆栈跟踪:

  InjectedScript.evaluate
    InjectedScript._evaluateAndWrap
Run Code Online (Sandbox Code Playgroud)

而第二个:

  InjectedScript.evaluate
    InjectedScript._evaluateAndWrap
      InjectedScript._evaluateOn
        evaluate
Run Code Online (Sandbox Code Playgroud)

我认为这更多地与引擎内部有关,而不是官方 js 规范,并且可能可以优化以使用相同的代码路径。