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

前端之家收集整理的这篇文章主要介绍了javascript – 具有负数组索引的Safari中无法解释的行为前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
编辑:更简单的repro案例;以下代码
  1. setInterval(function(){
  2. var a=[10,20,30,40],i=-1;
  3. a[-1] = 42;
  4. while (i<10000) a[i++];
  5. console.log(a[-1],a[4294967295]);
  6. },100);

…产生输出

  1. 42 undefined
  2. undefined 42
  3. 42 undefined
  4. 37x undefined 42
  5. 42 undefined
  6. undefined 42
  7. 42 undefined
  8. 41x undefined 42
  9. 42 undefined
  10. undefined 42
  11. 42 undefined

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

(原始问题如下)

给出以下代码(或code like it (fiddle)):

  1. <!DOCTYPE HTML>
  2. <html><head><title>-1 Array Index</title></head><body>
  3. <label>p: <input id="p" size="3"></label>
  4. <script type="text/javascript">
  5. var p = document.getElementById('p');
  6. p.onkeyup = function(){
  7. var a = "10 20 30 40".split(/\s+/);
  8. foo(a,p.value*1);
  9. }
  10.  
  11. function foo(a,p){
  12. var count=a.length,i=0,x;
  13. if (p) a[i=-1]=p;
  14. while (i<10000) x = a[i++ % count];
  15. console.dir(a);
  16. }
  17. </script>
  18. </body></html>

当我关注“p”输入并输入1退格2时,我在Developer Console中看到以下内容

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

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

任何人都可以对这个问题的根源有什么看法?

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

解决方法

这听起来像是JavaScriptCore中的一个错误.当foo第二次被调用时,foo可能正在被JIT,并且JITted代码引入了bug.

我建议filing a bug对抗JavaScriptCore并附上你的测试用例.

猜你在找的JavaScript相关文章