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 许可协议
这绝对是一个BUG!这是一个非常严重的错误。
该错误是由于优化了数组初始值设定项,其中所有值都是原始文字。例如,给定函数:
所有从调用
buildArray()
返回的数组引用将链接到相同的内存,并且一些方法如toString()
将缓存它们的结果。通常,为了保持一致性,对此类优化数组的任何可变操作都会将数据复制到单独的内存空间并链接到它;这种模式称为 写时复制,简称 CoW。reverse()
方法改变数组,所以它应该触发写时复制。但事实并非如此,因为最初的实施者(Apple 的 Keith Miller)错过了reverse()
案例,尽管他已经编写了许多测试用例。该错误已于 8 月 21 日 报告给 Apple 。该修复程序于 8 月 27 日 登陆 WebKit 存储库,并于 2018 年 10 月 30 日在 Safari 12.0.1 和 iOS 12.1 中发布。