Rog*_*ier 10 javascript unsigned shift ipad operator-keyword
我不小心碰到了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>
Run Code Online (Sandbox Code Playgroud)
奇怪的是,它正确地生成了一堆,但在某个时刻,某些东西会中断并且从那时起它只会输出零.
显然>>> 0在这里毫无意义(零位置的移位通常什么都不做,尽管如果javascript做出这种区分,它可能会强制整数变为无符号).这只是为了证明这个问题,如果你省略了>>> 0它没有显示出来.在我的实际情况中,有不同的数字和更复杂的表达涉及,但同样的事情发生:一切都工作,直到一些迭代,然后一些'休息'和变量突然变成并保持为零,即使在后续计算真正应该做他们非零.
适用于Android和PC浏览器.奇怪吧?
这不是一个“真正的”答案,但也许是一个有用的答案,假设(看起来很可能)这只是 Apple JIT 编译器中的一个错误:这个 StackOverflow 线程(Disabling JIT in Safari 6 to workaround strict Javascript JIT bugs)讨论了如何禁用代码上的 JIT。基本上,
将有问题的语句包装在不执行任何操作的 try-catch 块中。
我没有可供测试的 iOS 设备,但这是否可以解决问题?您可以对原始代码应用相同的解决方法吗?
function Strange()
{
try
{
return one = (Zero()+1) >>> 0;
}
catch (e) { throw e }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
251 次 |
| 最近记录: |