parseInt()比toString()更快吗?

4

我正在检查一个数字数组是否在JavaScript中是全数字的。简单来说,就是如果它是一个9位数,则必须有所有的数字1-9。我已经对数字数组进行了排序,并编写了以下循环:

for(var i = 0; i < 9; i++) {
    if(parseInt(digits[i]) != i+1) {
        return false;
    }
}

但我想知道以下内容是否更快:

for(var i = 0; i < 9; i++) {
    if(digits[i] != (i+1).toString()) {
        return false;
    }
}

我不确定哪种方法更快。我觉得将其转换为字符串比解析成数字要快。我尝试过运行几个测试,但结果并没有令人信服:我的电脑太老了,结果非常不稳定。
哪种方法会更快,为什么?这种速度差异会随着数字的增大而增加吗?
编辑
“digits”是排序后的数字字符串数组,例如:
var digits = [ "1", "2", "3", "4", "5", "6", "7", "8", "9" ];

4
利用 != 运算符比较单个数字和其字符串版本是否相等或不相等可能会更快,正好符合您的要求! - Pointy
1
这几乎肯定会严重依赖于引擎实现的具体细节,并且在处理您无法本地处理的数字之前并不重要。此外,您没有考虑我能想到的其他三种方法以及我没有考虑的其他方法。 - dtanders
3
没错。在JavaScript中,"2" == 2true,而"2" != 3也是true - Pointy
1
@brso05 请查看链接。这是欧拉计划的项目。 - Jonathan Lam
7
抛开整个for循环,改为使用return digits.join("") === "123456789",意思不变。 - andi
显示剩余8条评论
2个回答

4
根据jsperf.com的测试结果,在我的电脑和chrome浏览器上,使用parseInt()更快。请自行进行测试: 测试

enter image description here


5
针对这个问题,我不想显得愚钝,但是你为什么需要确切地知道为什么 parseInt() 更快呢?另外,标题只是一个演示;你真的需要在感谢 @mmm 的帮助之上指出一个简单的拼写错误吗? :P - BenM
2
这个测试没有意义。digits 明显应该是一个字符串,而不是一个数字数组。(尽管parseInt 仍然似乎更快 - Bergi
3
是的,在测试编写之后,OP更新了问题,并提供了这些信息。@Bergi - baao
3
考虑到更新后的问题,DV要求非常严格。 - BenM
我添加了修订版4。避免字符串转换比其他选项快得多。 - Cameron
显示剩余3条评论

1
我认为两者都不是很快,这取决于优化器的好坏。
避免完全进行字符串转换并直接使用序数值可能会更快(这种方式没有临时分配)。
for (var i = 0; i < 9; i++) {
    if (digits.charCodeAt(i) != 48 /* '0' */ + i + 1) {
        return false;
    }
}

这是我尝试快速检测全数字数的方法:

function pandigital(s) {
    var seen = [0,0,0,0,0,0,0,0,0];
    for (var i = 0; i != s.length; ++i) {
        var ord = s.charCodeAt(i);
        if (ord <= 48 || ord > 48 + s.length) return false;
        if (seen[ord - 48 - 1]++) return false;
    }
    return s.length > 0;
}

我认为 OP 可能是在 "" 上分割字符串,然后对该数组进行排序。还要注意问题线程中 @andi 的聪明评论。 - Pointy
是的,那可能会成为瓶颈呢。Andi的代码无疑是最简单、最优雅的解决方案,但很可能不是最快的(特别是如果字符串本来就没有被分割和排序)。 - Cameron

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