资讯专栏INFORMATION COLUMN

js中Array方法重写(四):mySlice() ; mySplice()

Michael_Ding / 1622人阅读

一、mySlice()
//mySplice    选取数组的的一部分,并返回一个新数组
Array.prototype.mySlice = function(start,end){
    var arr = [];
    if(arguments.length == 0){           //如果不传参数,返回一个原数组副本
        start = 0;
        end = this.length;
    }else{                                //加工传进来start参数,使他符合循环要求
        start = Number(start);
        if(Number.isNaN(start)){
            start = 0;
        }else if(start < 0){
            if(start < -(this.length)){
                start = -this.length;
            }
            start = start + this.length;
        }    
    }
    if(arguments.length == 2){            //加工传进来end参数,使他符合循环要求
        end = Number(end);
        if(Number.isNaN(end)){
            end = this.length;
        }else if(end < 0){
            if(end < -(this.length)){
                end = -this.length;
            }
            end = end + this.length;
        }else if(end > this.length){
            end = this.length;
        }
    }
    if(end == undefined){                //如果没传end参数,默认设为数组长度
        end = this.length;
    }
    for(var i = Math.floor(start); i < Math.floor(end) ; i++){
        arr.myPush(this[i]);
    }
    return arr;
}
二、mySplice()
//mySplice        从数组中添加或删除元素
Array.prototype.mySplice = function(){
    var index,howmany;
    if(arguments.length == 0){
        this.length = 0;
        return this;
    }else if(arguments.length == 1){        //调整index和howmany的值
        index = arguments[0];
        if(index >= this.length){
            index = this.length;
        }else if(index < -this.length){
            index = 0;
        }else if(index < 0 && index >= -(this.length)){
            index += this.length;
        }
        howmany = this.length - index;
    }else if(arguments.length >= 2){        //调整index和howmany的值
        index = arguments[0];
        if(index >= this.length){
            index = this.length;
        }else if(index < -this.length){
            index = 0;
        }else if(index < 0 && index >= -(this.length)){
            index += this.length;
        }
        howmany = arguments[1];
        if(index+howmany >= this.length){
            howmany = this.length - index;
        }

    }
    var t1 = index;
    var length = arguments.length - 2;
    var arr = [];
    for(var i = 0 ; i < howmany ; i++){             // 返回删除的数组
        arr[i] = this[t1++];
    }
    var t2 = index;
    for(var i = t2 + howmany ; i < this.length ; i++){  //删除操作后的数组
        this[t2++] = this[i];
    }
    this.length = this.length - howmany;

    if(arguments.length > 2){                            //插入数
        var lastLength = this.length; 
        var leap = lastLength - index;
        var arIndexRigtht = arguments.length - 1;
        this.length = this.length + arguments.length - 2;
        for(var j = this.length - 1 ; j >= index ; j--){        
            if(leap > 0){
                this[j] = this[j - arguments.length + 2];
                leap = leap -1 ;
            }else{
                this[j] = arguments[arIndexRigtht--];
            }
        }
    }
    return arr;
}
好吧,这两个方法感觉都写的很臃肿,日后能力提升了再修改吧。当然如果能提好的建议那就再好不过了。  ^_^

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94867.html

相关文章

  • slice方法重写及常见应用

    摘要:数组的原型上有一个方法叫做给不同的参数组合会返回不同的结果,由于组合非常多,这里研究一下不同组合的结果并基于原型链对该方法进行仿写考虑情况为负数,为负数,超出有效长度了,非有效数字源码如下不想看源码的请直接看最下面的结果处理没有参数的情况处 数组的原型上有一个方法叫做slice,给不同的参数组合会返回不同的结果,由于组合非常多,这里研究一下不同组合的结果并基于原型链对该方法进行仿写考虑...

    vvpvvp 评论0 收藏0
  • JS 进阶 (一)作用域深入和面向对象

    摘要:进阶第一章作用域深入和面向对象预解释全局作用域当浏览器加载页面的时候,提供了一个全局代码执行的环境预解释变量提升在当前的作用域中,代码执行之前,浏览器首先会默认的吧所有带有和的进行提前声明或定义理解声明和定义声明告诉浏览器在全局作用域中有 JS进阶 第一章作用域深入和面向对象 预解释 1、全局作用域:当浏览器加载HTML页面的时候,提供了一个全局js代码执行的环境 2、预解释(变量提升...

    chengtao1633 评论0 收藏0
  • 前端基本功-示例代码 (二)

    摘要:前端基本功示例代码一点这里前端基本功示例代码二点这里一像素伪类实现对于老项目,有没有什么办法能兼容的尴尬问题了,个人认为伪类是比较完美的方法了。 前端基本功-示例代码 (一) 点这里前端基本功-示例代码 (二) 点这里 1.一像素 伪类 + transform 实现对于老项目,有没有什么办法能兼容1px的尴尬问题了,个人认为伪类+transform是比较完美的方法了。 原理是把原先元素...

    Java3y 评论0 收藏0
  • 前端基本功-示例代码 (二)

    摘要:前端基本功示例代码一点这里前端基本功示例代码二点这里一像素伪类实现对于老项目,有没有什么办法能兼容的尴尬问题了,个人认为伪类是比较完美的方法了。 前端基本功-示例代码 (一) 点这里前端基本功-示例代码 (二) 点这里 1.一像素 伪类 + transform 实现对于老项目,有没有什么办法能兼容1px的尴尬问题了,个人认为伪类+transform是比较完美的方法了。 原理是把原先元素...

    wpw 评论0 收藏0
  • jsArray方法重写(二):myForEach;myEvery;mySome;myFilter;

    摘要:一数组每个元素都执行一次回调函数二检测数值元素的每个元素是否都符合条件三检测数组元素中是否有元素符合指定条件四检测数值元素,并返回符合条件所有元素的数组五将数组元素计算为一个值从左到右以上回调函数只是手写简化版,无法传参数,若有误或建议,请 一、myForEach //myForeach 数组每个元素都执行一次回调函数 Array.prototype.myForEach = fu...

    blair 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<