作为一个刚接触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;
};
如果在看的您对于此算法有更好的算法或理解,可以和大家一起分享,谢谢观看!!