为什么parseInt()比Firefox中的*1慢得多?

hoo*_*ter 15 javascript performance firefox

我有一个存储为字符串的值,我知道它将永远是一个整数.但我需要它作为一个数字,所以我在做n = n * 1.然后我想"嗯,我应该可以使用parseInt().然后我运行了一些jsperf测试,并且Firefox中的结果很有趣:

http://jsperf.com/parseintx1

总体而言,看起来操作非常相似,除了在Firefox中,使用*1速度异常快.这里发生了什么?


编辑

有人做了基础10测试,并整体更新了测试.点击此处也可以提供一些额外的反馈:http://jsperf.com/parseintx1/2

Poi*_*nty 2

无论如何,我都不是 JavaScript 引擎专家,甚至不是编译器专家,但我很确定这可以归结为这样一个事实:编译器可以告诉我们:

var a = "123";
a = a * 1;
Run Code Online (Sandbox Code Playgroud)

确实与以下完全相同:

var a = 123;
Run Code Online (Sandbox Code Playgroud)

因为“a”是一个局部变量,并且从其初始化到该* 1表达式都没有被使用,所以根本没有必要生成代码来执行该操作。在那之后,编译器也可能知道“a”无法从函数中“逃逸”,因此实际上没有必要做任何事情;也就是说,测试最终的结果可能* 1与您得到的结果相同:

function() {}
Run Code Online (Sandbox Code Playgroud)

然而,在这种parseInt()情况下,编译器无法确定它是否parseInt()真的parseInt(),因为它可能已被重新定义。因此,它必须生成代码来进行函数调用。