数组状态将缓存在 iOS 12 Safari 中。这是错误还是功能?

新手上路,请多包涵

2018.10.31更新

这个bug在iOS 12.1已经修复了,祝你有个美好的一天~

我在新发布的 iOS 12 Safari 中发现 Array 的值状态有问题,例如,代码如下:

 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
    <title>iOS 12 Safari bugs</title>
    <script type="text/javascript">
    window.addEventListener("load", function ()
    {
        let arr = [1, 2, 3, 4, 5];
        alert(arr.join());

        document.querySelector("button").addEventListener("click", function ()
        {
            arr.reverse();
        });
    });
    </script>
</head>
<body>
    <button>Array.reverse()</button>
    <p style="color:red;">test: click button and refresh page, code:</p>
</body>
</html>

刷新页面后,数组的值还是反转了。这是新 Safari 的错误还是功能?


这是一个演示页面。尝试将它与 iOS 12 Safari 一起使用: https ://abelyao.github.io/others/ios12-safari-bug.html

原文由 abelyao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 411
1 个回答

这绝对是一个BUG!这是一个非常严重的错误。

该错误是由于优化了数组初始值设定项,其中所有值都是原始文字。例如,给定函数:

 function buildArray() {
    return [1, null, 'x'];
}

所有从调用 buildArray() 返回的数组引用将链接到相同的内存,并且一些方法如 toString() 将缓存它们的结果。通常,为了保持一致性,对此类优化数组的任何可变操作都会将数据复制到单独的内存空间并链接到它;这种模式称为 写时复制,简称 CoW。

reverse() 方法改变数组,所以它应该触发写时复制。但事实并非如此,因为最初的实施者(Apple 的 Keith Miller)错过了 reverse() 案例,尽管他已经编写了许多测试用例。

该错误已于 8 月 21 日 报告给 Apple 。该修复程序于 8 月 27 日 登陆 WebKit 存储库,并于 2018 年 10 月 30 日在 Safari 12.0.1 和 iOS 12.1 中发布。

原文由 hax 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题