美文网首页
实现数组方法

实现数组方法

作者: 8d2855a6c5d0 | 来源:发表于2019-01-14 14:46 被阅读0次

首先实现join

var arr = [1, 2, 3, 4, 5, 6, 7, 8];


Array.prototype.myJoin = function (str) {
    var result = this[0] || '';
    var length = this.length;

    for (let i = 1; i < length; i++) {
        result += str + this[i];
    }

    return result;
}

实现slice

Array.prototype.mySlice = function (start, end) {
    var start = start || 0;
    var end = end || this.length;
    var newArr = [];

    for (let i = start; i < end; i++) {
        newArr.push(this[i]);
    }

    return newArr
}

以前经常使用Array.prototype.slice.call()将伪数组转换成数组,原理就是遍历伪数组将元素放到新的数组中返回出来,es6的新方法Array.from也是同样的功能。

实现foreachmap

Array.prototype.myForEach = function (fn) {
    for (let i = 0; i < this.length; i++) {
        if (i in this) {
            fn.call(null, this[i], i, this);
        }
    }
}

Array.prototype.myMap = function (fn) {
    var result = [];
    var temp = null;

    for (let i = 0; i < this.length; i++) {
        if (i in this) {
            result[i] = fn.call(null, this[i], i, this);
        }
    }

    return result
}

foreachmap的实现方式基本一样区别只是有没有返回值。

实现filter

Array.prototype.myFilter = function (fn) {
    var result = [];
    var temp = null;

    for (let i = 0; i < array.length; i++) {
        if (i in this) {
            if (temp = fn.call(null, this[i], i, this)) {
                result.push(temp);
            }
        }
    }

    return result;
}

实现reduce

Array.prototype.myReduce = function (fn, init) {
    var result = init;

    for (let i = 0; i < this.length; i++) {
        if (i in this) {
            result = fn.call(null, this[i], i, this);
        }
    }

    return result
}

不清楚js源码中reduce是如何实现的,以前看大漠老师的博客讲到reduce的效率比for循环要高,想必内部不是使用了for循环。

相关文章

网友评论

      本文标题:实现数组方法

      本文链接:https://www.haomeiwen.com/subject/ykmlkqtx.html