iPad上的javascript unsigned shift操作符出了什么问题?

时间:2013-10-14 10:02:30

标签: javascript ipad operator-keyword unsigned shift

我不小心碰到了iPad上Safari的javascript引擎中一个非常奇怪的错误。

无符号移位运算符>>>应该按位右移一个数字。我在脚本中遇到了一些错误,这些错误在其他平台上运行良好,将其剥离并以此结束:

<html><head><script type='text/javascript'>

var one = 1;

function Zero()
{
    return one*0;
}

function Strange()
{
     return one = (Zero()+1) >>> 0;
}

var s = 'A bunch of ones: '; // except on iPad :(
for (var i=0; i<200; i++) 
{
     s += Strange()+' ';
}
document.write(s);

</script></head><body></body></html>

Live demo

奇怪的是,它正确地生成了一堆,但在某一点上,某些东西中断并且它从那时起只输出零。

显然&gt;&gt;&gt; 0在这里没有意义(零位移位通常什么都不做,虽然如果javascript做出区分,它可能会强制整数变为无符号)。这只是为了证明问题,如果你省略&gt;&gt;&gt; 0它没有显示出来。在我的实际情况中,有不同的数字和更复杂的表达涉及,但同样的事情发生:一切都工作,直到一些迭代,然后一些'休息'和变量突然变成并保持为零,即使在后续计算真正应该做他们非零。

在Android和PC浏览器上正常运行。奇怪吧?

2 个答案:

答案 0 :(得分:2)

不是一个“真实”的答案,但也许是一个有用的答案,假设(似乎非常可能)这只是Apple的JIT编译器中的一个错误:这个StackOverflow线程(Disabling JIT in Safari 6 to workaround severe Javascript JIT bugs)讨论了如何禁用JIT在你的代码上。基本上,

  

在一个do-nothing try-catch块中包装有问题的语句。

我没有要测试的iOS设备,但是这会让问题消失吗?您可以对原始代码应用相同类型的变通方法吗?

function Strange()
{
    try
    {
        return one = (Zero()+1) >>> 0;
    }
    catch (e) { throw e }
}

答案 1 :(得分:0)

对于记录,在iOS 4.2.1上运行的Mobile Safari 5.0.2上似乎没有出现所描述的错误行为