定义 Array.prototype.属性 是不是有bug
发布于 6 年前 作者 yan23 13447 次浏览 来自 问答
  • 当前 Bug 的表现(可附上截图)

做了一个阅读器,记录用户阅读过的章节,要求用户凡是看过的章节如果是连续则合并在一起,正序排列,如用户看了

1,2,3,4,5章, 则显示 1-5, 如果用户看了1,3,2,4,5 也显示1-5, 如果用户看了 1,2,3,5,6,7,9,11章,则显示 1-3,5-7,9,11 章,

我的代码如下:

//数组去重函数

array_unique: function(arr) {

    for (var i = 0; i < arr.length; i++) {

        for (var j = i + 1; j < arr.length; j++) {

            if (arr[i] == arr[j]) {

                arr.splice(j, 1);

                j–;

            }

        }

    }

    return arr;

},

let readfoot = [];//定义数组

readfoot.push(page);//此处省略,功能是记录所有页码,这是前提

正式代码如下:

readfoot = that.array_unique(readfoot);//去重

readfoot = readfoot.sort(function (a, b) { return a - b; });//排序

let readfoot2 = [];

let readfoot_start = readfoot[0];//第一个数字

let readfoot3 = [];

let lianxu_flag = false;// 判断目录是否连续

if (readfoot.length > 1) {// 如果读的不只一章

    for (var i = 1; i < readfoot.length; i++) {

        if (readfoot[i] != (readfoot[i - 1] + 1)) {// 判断后一个是否等于前一个值 +1

            if (lianxu_flag) {// 如果后一个值等于前一个值 +1 ,那么就是连续的,连续的以数组的形式存

                readfoot3.push([readfoot_start, readfoot[i - 1]]);

            } else {

                readfoot3.push(readfoot_start);//不连续的存单个的字符

            }

            readfoot_start = readfoot[i];

            if (i == readfoot.length - 1) { //如果是最后一个元素,则结束

                readfoot3.push(readfoot_start);

            }

            lianxu_flag = false;

        } else {// 如果后一个值等于前一个值 +1 ,那么就是连续的

            lianxu_flag = true;

            if (i == readfoot.length - 1) {//如果是最后一个元素,则结束

                readfoot3.push([readfoot_start, readfoot[i]]);

            }

        }

    }

} else {

    readfoot3.push(readfoot_start); // 只有一章则只存一章

}

for (let k in readfoot3) {

    if ((typeof readfoot3[k]).toLowerCase() == ‘object’) {//如果存的是数组

    readfoot2.push(readfoot3[k].join(’-’));

    } else {//如果存的是单个字符

        readfoot2.push(readfoot3[k]);

    }

}

readfoot2 = readfoot2.join(’,’);

  • 预期表现

经过测试, 以上代码适用, 但是,但是会有我搞不懂的bug!!

偶尔, 偶尔会出现这种字符串: 只读第四张,出现 4,function(){for(var e=this.length,a=void 0;e;){var n=[this[a=Math.random()*e–>>>0],this[e]];this[e]=n[0],this[a]=n[1]}return this}, 我只读了第四章,不知道什么意思。 检查后面字符串, 发现是之前定义的一个属性内容:如下

Array.prototype.shuffle = function () {

    let m = this.length, i;

    while (m) {

        i = (Math.random() * m–) >>> 0;

        [this[m], this[i]] = [this[i], this[m]]

    }

    return this;

};

所以我只读了第 4 章, 却出现 4,function(){for(var e=this.length,a=void 0;e;){var n=[this[a=Math.random()*e–>>>0],this[e]];this[e]=n[0],this[a]=n[1]}return this} 是什么意思?  我定义的 Array.prototype.shuffle 这个函数被 当做 我目前这个数组 的值 做为 join 函数的参数传递了?????

这是bug吗?!  怎么解决, 我实在不知道怎么解决。  而且这个不好复现, 我 Array.prototype 这样定义过不只shuffle这一个函数,其他这样定义的函数也曾出现过在console.log()的值里, 怎么解决 ,help help help!!!  求解答

  • 复现路径
  • 提供一个最简复现 Demo
回到顶部