Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js indexOf有时会中断,但仅在某些情况下。这是一个V8错误吗?_Javascript_Node.js_V8 - Fatal编程技术网

Javascript Node.js indexOf有时会中断,但仅在某些情况下。这是一个V8错误吗?

Javascript Node.js indexOf有时会中断,但仅在某些情况下。这是一个V8错误吗?,javascript,node.js,v8,Javascript,Node.js,V8,我在对大量数字数组使用indexOf时遇到了一个非常奇怪的错误。它有时会在不应该返回的时候返回-1 我用代码的一小部分重新创建了这个问题。Array.prototype.indexOf似乎在所有情况下都能像预期的那样工作,但不确定这是为什么,但它作为故障测试很有用 奇怪的是,在函数中使用eval()会改变indexOf的行为。我倾向于V8优化紧循环中代码的方式。我假设eval()只是触发函数中的去优化 谷歌搜索这一问题似乎没有发现任何类似的问题。这是V8内部的一个bug吗 下面是代码,只需保存到

我在对大量数字数组使用indexOf时遇到了一个非常奇怪的错误。它有时会在不应该返回的时候返回-1

我用代码的一小部分重新创建了这个问题。Array.prototype.indexOf似乎在所有情况下都能像预期的那样工作,但不确定这是为什么,但它作为故障测试很有用

奇怪的是,在函数中使用eval()会改变indexOf的行为。我倾向于V8优化紧循环中代码的方式。我假设eval()只是触发函数中的去优化

谷歌搜索这一问题似乎没有发现任何类似的问题。这是V8内部的一个bug吗

下面是代码,只需保存到文件并在命令行上使用“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();
//使用Node.js运行此脚本以查看它是否抛出。出于某些原因,它在浏览器中运行良好。也许是一个优化错误
函数循环(){
var-arr=[0];
var i=0;
//eval('(1);//==取消注释这使它工作
而(i<4101){/==使其变小使其工作
var num=(i%2)/2;//==简化它可以让它工作
//console.log(num);
if(arr.indexOf(num)!==Array.prototype.indexOf.call(arr,num)){
console.log('i',i);
log('num',num);
抛出新错误('WTF这不应该发生!');
}
i++;
}
}
loop();

编辑:Anzeo已在v0.12.5中指出了这一点,我已对此进行了确认。我使用的是v0.12.2,还尝试了v0.10.38和iojs-v2.0.1,这些都暴露了这个bug。看起来这是一个V8问题,在最近的版本中已得到修复。

对于后代,您正在运行哪个版本的节点?我正在Windows 8 x64 node 0.12.5上运行此功能,但没有发现错误。这很有用。我使用的是v0.12.2。它似乎没有出现在v0.12.5中,因此我猜测这是一个最近已修复的问题。可能已经发现了问题:对于后代,您正在运行哪个版本的节点?我正在Windows 8 x64 node 0.12.5上运行此操作,但没有发现错误。这很有用。我使用的是v0.12.2。它似乎没有出现在v0.12.5中,因此我猜测这是一个最近已修复的问题。可能已发现该问题: