《javascript语言精粹》学习笔记 – 数组方法实现


js中数组是经常被使用到的,我们除了要学习数组的方法,还需要了解诶一下某一些方法是如何来实现的。然而我看了《javascript语言精粹》中方法的一章,想记录下书上的代码,以便加深印象。

Array pop()

poppush方法使得数组可以从堆栈一样工作。

Array.method('pop', function(){
    return this.splice(this.length - 1, 1)[0];
});

Array push()

push方法把一个或者多个的参数附加到一个数组的尾部。

Array.method('push', function(){
    this.splice.apply( this, [this.length, 0].concat(Array.prototype.slice.apply(arguments)));
    return this.length;
});

Array shift()

shift方法移除数组中的第一个元素并且放回该元素。

Array.method('shift', function(){
    return this.splice(0, 1)[0];
});

Array.unshift()

unshift方法像push一样,用于把元素添加到数组中,但它是吧参数插入到数组开始部分而不是尾部。

Array.method('unshift', function(){
    this.splice.apply(this, [0, 0].concat(Array.prototype.slice.apply(arguments)));
    return this.length;
});

Array splice()

splice方法从数组中移除一个或者多个元素,并且用新的参数替换它们。

Array.method('splice', function(start, deleteCount){
    var max = Math.max,
        min = Math.min,
        delta, el, 
        insertCount = max(arguments.length - 2, 0),
        k = 0,
        len = this.length,
        new_len, result = [], shift_count;

    start = start || 0;
    if (start < 0) {
        start += len;
    }
    start = max(min(start, len), 0);
    deleteCount = max(min(typeof deleteCount === 'number' ? deleteCount : len, len - start), 0);
    delta = insertCount - deleteCount;
    new_len = len + delta;
    while (k < deleteCount) {
        el = this[start + k];
        if (el !== undefined) {
            result[k] = el;
        }
        k += 1;
    }
    shift_count = len - start - deleteCount;
    if (delta < 0) {
        k = start = insertCount;
        while (shift_count) {
            this[k] = this[k - delta];
            k += 1;
            shift_count -= 1;
        }
        this.length = new_len;
    } else if (delta > 0) {
        k = 1;
        while (shift_count) {
            this[new_len - k] = this[len - k];
            k += 1;
            shift_count -= 1;
        }
        this.length = new_len;
    }
    for (k = 0; k < insertCount; k ++) {
        this[start + k] = arguments[k + 2];
    }
    return result;
});

这里只是摘抄了书上的一些实例,还有许多数组的方法可以思考如何去实现,如果有什么不对的地方请指教,与大家共勉!


发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>