具有负数组索引的Safari中无法解释的行为

Phr*_*ogz 7 javascript safari macos

编辑:更简单的repro案例; 以下代码:

setInterval(function(){
  var a=[10,20,30,40], i=-1;
  a[-1] = 42;
  while (i<10000) a[i++];
  console.log(a[-1],a[4294967295]);
},100);
Run Code Online (Sandbox Code Playgroud)

...产生输出:

     42 undefined
     undefined 42
     42 undefined
37x  undefined 42
     42 undefined
     undefined 42
     42 undefined
41x  undefined 42
     42 undefined
     undefined 42
     42 undefined
Run Code Online (Sandbox Code Playgroud)

亲自尝试:http://jsfiddle.net/Fjwsg/


(原始问题如下)

给出以下代码(或类似代码(小提琴)):

<!DOCTYPE HTML>
<html><head><title>-1 Array Index</title></head><body>
  <label>p: <input id="p" size="3"></label>
  <script type="text/javascript">
  var p = document.getElementById('p');
  p.onkeyup = function(){
    var a = "10 20 30 40".split(/\s+/);
    foo(a, p.value*1);
  }

  function foo(a,p){
    var count=a.length, i=0, x;
    if (p) a[i=-1]=p;
    while (i<10000) x = a[i++ % count];
    console.dir(a);
  }
  </script>
</body></html>
Run Code Online (Sandbox Code Playgroud)

当我关注"p"输入并输入时,我在Developer Console中看到以下内容1 backspace 2:
数组在第一次传递时索引为-1,在第三次传递时索引为4294967295

一旦我看到4294967295(2 32 - 1)的索引显示,事情有时会开始"变坏":有时开发人员工具会自动关闭,有时所有Safari选项卡都会冻结并需要重新启动才能恢复.

奇怪的是,如果我在循环中移除(在这种情况下很大程度上无用),我无法重复这一点.我无法在Chrome或Firefox上重复此操作.

任何人都可以对这个问题根源的可能性有所了解吗?

OS X 10.7.4上的Safari 5.1.7就是这种情况

小智 2

对我来说,这听起来像是 JavaScriptCore 中的一个错误。也许foo是在第二次调用时进行了 JITted,并且 JITted 代码引入了该错误。

我建议针对 JavaScriptCore提交错误并附上您的测试用例。