gpt4 book ai didi

javascript - iOS Javascript 引擎 parseFloat(1) 返回负数

转载 作者:可可西里 更新时间:2023-11-01 03:17:40 29 4
gpt4 key购买 nike

此代码将使错误出现:

function causeBug(d) {
var k;
var n = parseFloat(1);
var c = Math.abs(d);
if (n < 0) {
k = '-';
} else {
k = '+';
}
return k + n;
}

$(function() {
for (var i = 0; i <= 2000; ++i) {
$('body').append(i + ': ' + causeBug(2) + '<br>');
}
});

在这个 fiddle 中可见:http://jsfiddle.net/H2SEN/16/ (在 Mobile Safari 中查看,向下滚动,在某个点您会看到 parseFloat(1) < 0)。从第 73 次迭代到超过 1500 次迭代,在任何地方都发现了负片。

注意一些看似不必要的代码,例如未使用的参数 d 和未使用的变量 var c = Math.abs(d); 实际上是必要的发生错误。对于 return 语句中 n 的使用和 parseFloat 调用也是如此(尽管 parseInt 也会导致它)。

错误仅在真正的 iPhone 4s (7.0.6) 和两个 iPod Touch (7.1 beta) 上重现。不在 iPad 或 iOS 模拟器,或任何桌面浏览器中。如果您启用了远程调试并在计算机上打开了 Safari 控制台,则不会出现此错误。

我相当有信心这就是这个未回答问题的确切原因:Strange JavaScript behaviour on mobile Safari iOS 6

如果能深入了解此错误的潜在原因,我们将不胜感激。

最佳答案

也许是 JIT 问题?我在 JavascriptCore 源代码中发现了 Math.abs 的实现,我猜它与 Nitro(ios js 引擎)不同,或者可能被标记为 JIT 可执行文件。

Value MathFuncImp::call(ExecState *exec, Object &/*thisObj*/, const List &args)
{
double arg = args[0].toNumber(exec);
double arg2 = args[1].toNumber(exec);
double result;

switch (id) {
case MathObjectImp::Abs:
result = ( arg < 0 || arg == -0) ? (-arg) : arg;
break;

这可以直接用javascript实现。所以你可以用

替换你的 Math.abs 调用
result = ( arg < 0 || arg == -0) ? (-arg) : arg;

这将解决问题并跨浏览器兼容。

提交的 Apple Bug:16209709

有谁知道这种错误是如何发生的,或者有更好的描述方式吗?

比特翻转?内存冲突?某种溢出?

关于javascript - iOS Javascript 引擎 parseFloat(1) 返回负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22139746/

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