数组的slice与splice方法实现

1.slice的用法

slice() 方法可从已有的数组中返回选定的元素。
slice()方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。
注意:
1.slice(start,end) 方法不会改变原始数组
2.start是开始复制的起始位置,默认为0,end是结束位置,默认为数组长度
3.如果传入的参数是负数 代表从后往前数 比如-1指的是最后一项元素
4.slice是浅拷贝

2.slice使用示例

    const arr = [1, 2, 3, 4, 5]
    console.log(arr.slice());//[1, 2, 3, 4, 5]
    console.log(arr.slice(8));//[]
    console.log(arr.slice(-1));//[5]
    console.log(arr.slice(-3, -1));//[3,4]

3.slice的实现

    Array.prototype.mySlice = function (start = 0, end = this.length) {
        //声明一个空数组,作为复制后返回值
        const res = [];
        //如果起始位置越界,返回空数组
        if (start >= this.length) return res
        //处理start和end小于0的情况
        if (start < 0) {
                start = start + this.length < 0 ? 0 : start + this.length;
        }
        if (end < 0) {
                end = end + this.length < 0 ? 0 : end + this.length;
        }
        //复制start至end的元素到res中 包括arr[start] 不包括arr[end]
        for (let i = start; i < end; i++) {
            res.push(this[i])
        }
        return res
    }

4.splice的用法

splice() 方法用于添加、修改或删除数组中的元素。
返回值是删除掉的数组元素 如果删除0个 返回空数组
注意:这种方法会改变原始数组。
splice方法的参数为(delIndex,deleteCount,insert1,insert2...)
delIndex是要删除的元素下标,为负时,处理与slice相同,大于等于数组长度时,为数组长度
deleteCount默认为0,是要从delIndex处删除的元素个数,这些被删除的元素将作为splice函数的返回值
之后的所有参数insert1,insert2...都是从delIndex处插入到原始数组的元素

5.splice的实现

    Array.prototype.mySplice = function (delIndex, count = 0, ...inserts) {
        //如果没有传入要插入的元素,将inserts设为空数组
        inserts = inserts || []
        //判断delIndex
        if (delIndex >= this.length) delIndex = this.length
        if (delIndex < 0) {
            delIndex = delIndex + this.length < 0 ? 0 : delIndex + this.length;
        }
        //获取返回值
        const res = this.slice(delIndex, delIndex + count);
        //获取在delIndex处删除到某些元素,并插入新元素之后的新数组This
        const This = [...this.slice(0, delIndex), ...inserts, ...this.slice(delIndex + count)]
        /* this替换处理开始  使用This替换旧的原始数组this  */
        //当this长度大于This时,无法全部覆盖,先将this多出的的部分删除
        while (this.length > This.length) {
            //删除this的最后一个元素,一直到this长度和This长度相同时,结束循环
            this.pop()
        }
        //delIndex之前this的元素与This相同,从delIndex之后全部重新赋值,使用This中的元素覆盖this的元素,达到改变this的效果
        for (let i = delIndex; i < This.length; i++) {
            this[i] = This[i]
        }
        /* this替换完毕 */
        //返回被删除的元素
        return res;
    }
仅为个人理解,如有错谬,欢迎指正。
如果对您有所帮助,请您点个赞吧!

你可能感兴趣的:(javascript,前端,es6)