kzen.dev
  • 疑问
  • 标签
  • 用户
通知
奖励
注册
一旦您注册,您将会收到对您的问题的回复和评论。
登录
如果您已经有一个账户,请登录查看新的通知。
增加的问题、答案和评论会有奖励。
更多
资料来源
编辑
 abelyao
abelyao
问题

阵列状态将在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

433 2018-09-18T15:51:30+00:00 4
Valeriu
Valeriu 56173
已编辑的问题 5日 十月 2021 в 8:38
 abelyao
abelyao
已编辑的问题 31日 十月 2018 в 3:56
iOS 12 Safari bugs
abelyao.github.io
编程
safari
javascript
ios
ios12
热门视频
SOLVED: Safari iOS &quot;Oops something went wrong&quot; error
SOLVED: Safari iOS "Oops something went wrong" error
2年前
👏不能错过的iOS15全新Safari必学小技巧iOS教学✅
👏不能错过的iOS15全新Safari必学小技巧iOS教学✅
2年前
CH - iPhone 清除 缓存 , iPhone cookie 清除 , iPhone的Safari无痕浏览模式怎么开启
CH - iPhone 清除 缓存 , iPhone cookie 清除 , iPhone的Safari无痕浏览模式怎么开启
4年前
How To Clear Cache On Safari Browser iPhone X IOS 12
How To Clear Cache On Safari Browser iPhone X IOS 12
4年前
【苏星河】我来讲讲为什么Safari是手机上最好的浏览器
【苏星河】我来讲讲为什么Safari是手机上最好的浏览器
3年前
How to change the font size on your iPhone 12 Safari browser
How to change the font size on your iPhone 12 Safari browser
2年前
苹果浏览器Safari 15曝漏洞 或泄露浏览活动和谷歌账户信息
苹果浏览器Safari 15曝漏洞 或泄露浏览活动和谷歌账户信息
1年前
2021 SAFARI 14 最新实用技巧
2021 SAFARI 14 最新实用技巧
2年前
How to change your safari browser to desktop website in iOS12 on all iPhone
How to change your safari browser to desktop website in iOS12 on all iPhone
2年前
safari settings we need to change right now on iPhone and iPad || safari not working on iPhone fix
safari settings we need to change right now on iPhone and iPad || safari not working on iPhone fix
1年前
苹果手机连接无线网不能正常上网,那是因为你没有打开这个开关!
苹果手机连接无线网不能正常上网,那是因为你没有打开这个开关!
4年前
safari settings we need to change right now on iPhone and iPad || safari not working on iPhone fix
safari settings we need to change right now on iPhone and iPad || safari not working on iPhone fix
1年前
Clear iPhone safari browser Cache, Browsing data || Apple info
Clear iPhone safari browser Cache, Browsing data || Apple info
4年前
How to clear your Safari History and Website data on iPhone 12 iOS 14.5
How to clear your Safari History and Website data on iPhone 12 iOS 14.5
2年前
« 前进
下一步 »
 hax
hax
18日 九月 2018 в 8:53
2018-09-18T20:53:22+00:00
更多
资料来源
编辑
#36810333

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

这个bug是由于数组初始化器的优化造成的,其中所有的值都是原始字元。例如,给定一个函数。

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

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

reverse()方法突变了数组,所以它应该触发写时复制。但是它没有,因为最初的实现者(苹果公司的Keith Miller)错过了reverse()的情况,尽管他写了很多测试案例。

这个错误在8月21日被报告给苹果。8月27日,该修复方案登陆WebKit仓库,并于2018年10月30日在Safari 12.0.1和iOS 12.1中出货。

 MultiplyByZer0
MultiplyByZer0
编辑本段答案24日 十一月 2018 в 9:18
Copy-on-write - Wikipedia
en.wikipedia.org
188794 &ndash; [JSC] Array.prototype.reverse modifies JSImmutableButterfly
bugs.webkit.org
Changeset 235356 – WebKit
trac.webkit.org
272
0
您有问题吗?将问题添加到网站上并立即得到答复
zh.kzen.dev
Edire   Fan
Edire Fan
18日 九月 2018 в 6:51
2018-09-18T18:51:09+00:00
更多
资料来源
编辑
#36810332

我写了一个lib来修复这个错误。 https://www.npmjs.com/package/array-reverse-polyfill

这就是代码。

(function() {
  function buggy() {
    var a = [1, 2];
    return String(a) === String(a.reverse());
  }
  if(!buggy()) return;
  var r = Array.prototype.reverse;
  Array.prototype.reverse = function reverse() {
    if (Array.isArray(this)) this.length = this.length;
    return r.call(this);
  }
})();
 Community
Community
编辑本段答案19日 九月 2018 в 7:31
GitHub - fanmingfei/array-reverse-ios12: Fixed Array Reverse Bug On iOS 12 &amp; Safari 12.0 on MacOS.
Fixed Array Reverse Bug On iOS 12 &amp; Safari 12.0 on MacOS. - GitHub - fanmingfei/array-reverse-ios12: Fixed Array Reverse Bug On iOS 12 &amp; Safari 12.0 on MacOS.
github.com
75
0
您有问题吗?将问题添加到网站上并立即得到答复
zh.kzen.dev
 jsist
jsist
20日 九月 2018 в 4:05
2018-09-20T16:05:13+00:00
更多
资料来源
编辑
#36810335

这是[webkit][1]的一个bug。 虽然他们那边已经解决了这个问题,但还没有随着iOS GM的发布而发货。 这个问题的解决方案之一。

(function() {
  function getReverseStr() {
    return [1, 2].reverse();
  }

  var n1 = getReverseStr()[0];
  var n2 = getReverseStr()[0];
  // check if there is an issue
  if(n1 != n2) {
    var origReverseFunction = Array.prototype.reverse;
    Array.prototype.reverse = function() {
      var newArr = this.slice();
      // use original reverse function so that edge cases are taken care of
      origReverseFunction.apply(newArr, arguments);
      var that = this;
      // copy reversed array
      newArr.forEach(function(value, index) {
        that[index] = value;
      });
      return this;
    }
  }
})();

[1]: https://bugs.webkit.org/show_bug.cgi?id=188794

188794 &ndash; [JSC] Array.prototype.reverse modifies JSImmutableButterfly
bugs.webkit.org
14
0
Atsushi Sasaki
Atsushi Sasaki
20日 九月 2018 в 4:37
2018-09-20T04:37:11+00:00
更多
资料来源
编辑
#36810334

如果元素的数量发生变化,似乎就不会被缓存了。<br&gt。 我能够像这样避免这种情况。

<!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];
        arr.push('');
        arr.pop();
        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>
6
0
您有问题吗?将问题添加到网站上并立即得到答复
zh.kzen.dev
添加问题
岚,巗峃,。
全部
技术
文化/娱乐
生活/艺术
科学
专业的
业务
用户
全部
新的
热门
1
Александр Македонский
注册5天前
2
Andrei Kalinin
注册3周前
3
Koroleva Ego
注册1个月前
4
Star Lenon
注册1个月前
5
Данил Жевнеров
注册1个月前
您有问题吗?将问题添加到网站上并立即得到答复
zh.kzen.dev
DE
ES
ID
JA
NO
PT
RO
TR
ZH
© kzen.dev 2023
资料来源
stackoverflow.com
特许 cc by-sa 3.0 有功