ios12 array.reverse问题

问题描述

iOS12发布之后,在测试中发现一个关于Array.reverse的问题,代码如下:

<!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>

问题描述:第一次进入刷新alert:1,2,3,4,第二次刷新就一直为alert4,3,2,1

demo演示

未修复的demo
已修复的demo

修复方法

原理就是判断是否为iOS12版本,重写Array.prototype.reverse方法,代码如下:

(function(){
    var ua = navigator.userAgent;
    if (!ua.match(/(iPhone|iPad|iPod)/)) return;
    var matched = ua.match(/OS ([\d_\.]+) like Mac OS X/);
    if (!matched || !matched[1]) return;
    if (matched[1].indexOf('12') !== 0) return;
    //以上判断是否为iOS12版本
    
    //以下为修复代码
    Array.prototype._reverse = Array.prototype.reverse;
    //重写reverse方法
    Array.prototype.reverse = function reverse() {
        //重新设置数组长度 从而避免reverse方法改变数据后被缓存
        if (Array.isArray(this)) this.length = this.length;
        return Array.prototype._reverse.call(this);
    }
    var nonenum = {
        enumerable: false
    };
    //设置Array原型链中的reverse方法不可枚举
    Object.defineProperties(Array.prototype, {
        _reverse: nonenum,
        reverse: nonenum,
    });
})()

希望大家不要遇到该类生产问题咯!(否则你都不知道哪里出错了~~)

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,971评论 2 59
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,523评论 25 708
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,018评论 3 119
  • 人向学 当勤问 愚不耻 贵在诚 学无涯 书无尽 弱一时 当自信 懂谦逊 明孝悌 论尊卑 唯在礼 近达贤 远妒言 辨...
    嫌疑人X的反思阅读 179评论 0 0
  • 曲终人未散 秋千树下有人抚琴,琴声入耳婉转悠扬。一曲终了扣弦,那人突然出声“唐亦瞳你还想睡到什么时候。”回答她...
    珞鸯阅读 333评论 0 1