当使用带有大量数字的indexOf时,我遇到了一个非常奇怪的错误。当它不应该时,它有时会返回-1。
我用一小部分代码重新创建了问题。在所有情况下,Array.prototype.indexOf似乎都按预期工作,不确定为什么会这样,但它可用作故障测试。
奇怪地在函数中使用eval()会改变indexOf的行为。我倾向于解决V8在紧密循环中优化代码的方式的问题。我假设eval()只是触发函数内的去优化。
谷歌搜索这个问题似乎没有发现任何与此问题相似的问题。这是V8中的一个错误吗?这是代码,只需保存到文件并使用" node"在命令行上。任何见解都将不胜感激。
// Run this script with Node.js to see it throw. Works fine in browsers for some reason. Maybe an optimisation bug
function loop() {
var arr = [0];
var i = 0;
//eval('(1)'); // ==== UNCOMMENTING THIS MAKES IT WORK
while (i < 4101) { // ==== MAKING THIS SMALLER MAKES IT WORK
var num = (i % 2) / 2; // ==== SIMPLIFYING THIS MAKES IT WORK
//console.log(num);
if (arr.indexOf(num) !== Array.prototype.indexOf.call(arr, num)) {
console.log('i', i);
console.log('num', num);
throw new Error('WTF this should not happen!');
}
i++;
}
}
loop();
编辑:Anzeo指出这项工作在v0.12.5,我已经证实了这一点。我正在使用v0.12.2,也尝试了v0.10.38和iojs-v2.0.1,这些都揭示了这个bug。看起来这是一个V8问题,已在最近的版本中得到修复。