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

5

我有这段代码:

var boo = 123123;

我想将那个数字转换成字符串,使用连接字符串比原生的JavaScript.toString()更快:
更快:
var foo = boo + ""; 

较慢:

var foo = boo.toString(); 

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

为什么使用.toString()比连接空字符慢?最后,我想知道使用+ ""技术代替.toString()是否正确?


我认为,一个需要查找Number原型的函数调用的开销比加号运算符的内置字符串连接重载要慢。 - Fabrício Matté
3
没问题,这是完全有效的,不过你应该将可读性视为比脚本执行时间中的微秒更重要的因素。 - Fabrício Matté
对我来说,这是可读性很高的代码,但这些概念因团队而异。=] 话说回来,有人说我写的代码很难懂,所以当为大型项目做出贡献时,我会尽量保持自己所写代码的“最易读”一面。 - Fabrício Matté
2
基准测试结果可能会因为某些运行时优化技术而产生扭曲,因为重复操作总是产生相同的结果。你可能想尝试使用这个基准测试 - Gumbo
它的非人类可读性到了这种程度:第一次看到它的人很可能不会在上下文中将其识别为字符串转换。 - Justin L.
显示剩余2条评论
1个回答

5

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

那么为什么一个比另一个慢呢?这是因为在toString中,V8内部将调用一个C函数。您可以尝试自己验证:

  • 在chrome中打开空标签页(以避免来自已打开页面的任何副作用)
  • 打开开发者工具
  • 打开Profiles选项卡并启动新配置文件
  • 转到Console选项卡并插入script1脚本,然后按Enter键。
  • 再次进入Profile并停止分析
  • script2重复相同的步骤

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

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

在我的情况下,第一个将导致以下堆栈跟踪:

  InjectedScript.evaluate
    InjectedScript._evaluateAndWrap

第二个:
  InjectedScript.evaluate
    InjectedScript._evaluateAndWrap
      InjectedScript._evaluateOn
        evaluate

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接