gpt4 book ai didi

javascript - iPad 上的 javascript 无符号移位运算符有问题吗?

转载 作者:可可西里 更新时间:2023-11-01 02:47:36 26 4
gpt4 key购买 nike

我不小心遇到了 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

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

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

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

最佳答案

这不是一个“真正的”答案,但也许是一个有用的答案,假设(看起来很有可能)这只是 Apple 的 JIT 编译器中的一个错误:这个 StackOverflow 线程(Disabling JIT in Safari 6 to workaround severe Javascript JIT bugs)讨论了如何在您的计算机上禁用 JIT代码。基本上,

Wrap the offending statement in a do-nothing try-catch block.

我没有可测试的 iOS 设备,但这是否可以解决问题?您能否将相同类型的变通方法应用于您的原始代码?

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

关于javascript - iPad 上的 javascript 无符号移位运算符有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19357775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com