浅谈数组算法slice

作为一个刚接触js的小白,对于数组原型中的方法还是有些不了解。

由于可能自己爱转牛角尖的性格,总喜欢去深挖低层算法,在这呢我就给大家分享一下我的slice()算法

要写一个算法就得看看这个函数想要实现的功能,所以之前呢就应该对slice()这个函数做一些测试;

比如:

 //[不传参数
var arr = [1,5,3,4,6,9,4];

console.log(arr.slice());  //[1, 5, 3, 4, 6, 9, 4]
 //传一个不同类型参数
console.log(arr.slice(undefined));//[1, 5, 3, 4, 6, 9, 4]
console.log(arr.slice(true));  //[5, 3, 4, 6, 9, 4]
console.log(arr.slice(-1));  //[4
console.log(arr.slice());  //[5, 3, 4, 6, 9, 4]]
console.log(arr.slice(NaN));//[1, 5, 3, 4, 6, 9, 4]
由上我们可以总结一些规则就是,在函数体中,函数会把参数列表中的参数使用Number()函数转换为Number类型,在去完成函数切割功能;
因此当我们传如两个参数我们就知道它的规律啦,这里我就不测试了,有兴趣的可以自行研究。

接下来,我们就可以开始写算法啦

刚开始我们要注意函数的传参问题,因为slice()函数是可以传入多个参数的,这点一定要注意,因此我们是不能够直接去定义它的参数个数,
可以用一种比较取巧的方法,就是我们不去设置它的参数个数,让函数本身去判断
var a = Number(arguments[0]) ? arguments[0] : 0,//设置第一个参数的默认值为0

b = Number(arguments[1]) ? arguments[1] : 0; //当参数为NaN,undefined,false,null,'',''时为0

 
这样我们就解决了参数个数问题,下面是函数整个算法

Array.prototype.slice = function() {


var that = this,arr = [],

a = arguments[0] ? (arguments[0]>=0 ? Math.floor(arguments[0]) : ((that.length - Math.abs(Math.ceil(arguments[0])))>0 ? (that.length - Math.abs(Math.ceil(arguments[0]))) : 0)) : 0,//设置第一个参数的默认值为0

b = arguments[1] ? (arguments[1]>=0 ? Math.floor(arguments[1]) : ((that.length - Math.abs(Math.ceil(arguments[1])))>0 ? (that.length - Math.abs(Math.ceil(arguments[1]))) : 0)) : 0; //当参数为NaN,undefined,false,null,'',''时为0



if(arguments.length > 1){

for(var i = 0;i<(b-a) && i<that.length-a;i++){
//这里需考虑截取数组的长度,如果单单只考虑i<(b-a),就会出现当b-a无限大,且a>0;数组中就会出现undefined

arr[i] = that[a+i];

}

}else{

for(var i = 0;i<that.length-a;i++){

arr[i] = that[a+i];

}

}

return arr;

};

如果在看的您对于此算法有更好的算法或理解,可以和大家一起分享,谢谢观看!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值