10

我不小心在 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>

现场演示

奇怪的是,它正确地生成了一堆 1,但在某个点上,有些东西坏了,从那时起它只输出零。

显然 >>> 0 在这里是没有意义的(在零位上的移位通常什么都不做,尽管如果 javascript 做出了这种区分,它可能会强制整数变为无符号)。这只是为了演示问题,如果您省略 >>> 0 它不会显示。在我的实际情况中,涉及到不同的数字和更复杂的表达式,但发生了同样的事情:一切正常,直到多次迭代,然后一些“中断”并且变量突然变为并保持为零,即使在随后的计算之后,确实应该进行他们非零。

在 Android 和 PC 浏览器上运行良好。奇怪吧?

4

2 回答 2

2

不是一个“真正的”答案,但可能是一个有用的答案,假设(似乎很可能)这只是 Apple 的 JIT 编译器中的一个错误:这个 StackOverflow 线程(在 Safari 6 中禁用 JIT 以解决严重的 Javascript JIT 错误)谈论如何禁用代码上的 JIT。基本上,

将有问题的语句包装在一个什么都不做的 try-catch 块中。

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

function Strange()
{
    try
    {
        return one = (Zero()+1) >>> 0;
    }
    catch (e) { throw e }
}
于 2013-11-11T19:47:25.180 回答
0

作为记录,在 iOS 4.2.1 上运行的 Mobile Safari 5.0.2 上似乎没有发生所描述的错误行为

于 2013-11-14T12:37:34.243 回答