Skip to content

Array.prototype.splice

  1. 参数问题:
    1. start:指定修改的开始位置(从0计数)。如果超出了数组长度,则从数组末尾开始添加内容。如果是负值,则表示从数组末尾开始的第几位(从-1计数,这意味着-n是倒数第n个元素并且等价于arr.length - n);如果负值的绝对值大于数组长度,则表示开始位置为第0位
    2. deleteCount:整数,表示要移除的数组元素的个数。如果deleteCount大于start之后的元素总数,则从start后面的元素都将被删除(含start)。如果deleteCount被省略了,或者它的值大于等于arr.length - start,那么start(含start)之后数组的所有元素都会被删除。如果deleteCount是0或者负数,则不移动元素
    3. item1,item2...:要添加进数组的元素,从start位置开始。如果不指定,则splice()将只删除元素
  2. 返回值由被删除的元素组成的一个数组。如果只删除一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组
  3. 改变原数组
  4. 注意如果是插入值的话,是在start参数对应元素之前插入

重写splice方法目前对于我来说,暂时不太理解,先不写了,以后再来解决。如果有兴趣的可以看看ECMA262文件实现的过程

splice实现的思路

Array.prototype.concat

  1. 参数的问题:
    1. valueN:数组或者值,将被合并的一个新的数组中,如果省略了所有valueN参数,则concat会返回调用此方法的现存数组的一个浅拷贝
    2. 数据类型如字符串,数字,布尔(不是包装类对象),concat将字符串和数字的值复制到新数组中 [].concat('str') --> ['s', 't', 'r']
  2. 返回值是新的Array实例,所以如果省略了ValueN参数,则返回源数组的浅拷贝数组
js
Array.prototype.myConcat = function (/*valueN*/) {
    var t = Object(this),
        idx = t.length,
        res = []

    // 没有传递参数
    for (var key in t) {
        if (t.hasOwnProperty(key)) {
            res[key] = t[key]
        }
    }

    if (arguments.length > 0) {
        // 传递参数
        for (var key in arguments) {
            var len = res.length
            // 判断当前这个元素的类型,是值还是数组
            if (arguments[key] instanceof Array) {
                // 数组
                for (var keys in arguments[key]) {
                    if (arguments[key].hasOwnProperty(keys)) {
                        res[len++] = arguments[key][keys]
                    }
                }
            } else {
                // 值
                res[len] = arguments[key]
            }
        }
        return res
    }
    return res
}

Array.prototype.slice

  1. 参数问题:
    1. begin:提取起始值处的索引(从0开始),从该索引开始提取原数组元素。如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2)表示提取原数组中的倒数第二个元素到最后一个元素。如果省略begin,则slice从索引0开始。如果begin超出数组的索引范围,则会返回空数组
    2. end:提取终止处的索引(从0开始),在该索引处结束提取原数组元素。slice会提取原数组中索引从bengin到end的所有元素,范围([begin, end))。如果该参数为负数,则它表示在原数组中的倒数第几个元素结束抽取。如果end被省略,则slice会一直提取到原数组的末尾。如果end大于数组的长度,slice也会一直提取到原数组末尾
  2. 返回值是一个含有被提取元素的新数组
js
Array.prototype.mySlice = function (/*begin, end*/) {
    var t = this,
        len = this.length,
        idx = -1
    ;(begin = arguments[0] != undefined ? (arguments[0] < 0 ? len + arguments[0] : 0) : 0),
        (end = arguments[1] != undefined ? (arguments[1] < 0 ? len + arguments[1] : arguments[1]) : len),
        (res = [])

    if (end >= len) {
        end = len
    }

    for (var key in t) {
        if (t.hasOwnProperty(key)) {
            if (key >= begin && key < end) {
                res[++idx] = t[key]
            }
        }
    }
    return res
}