浅谈数组算法slice

来源:互联网 发布:无头骑士异闻录 知乎 编辑:程序博客网 时间:2024/06/02 00:44

作为一个刚接触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));  //[4console.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,//设置第一个参数的默认值为0b = 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,//设置第一个参数的默认值为0b = 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,'',''时为0if(arguments.length > 1){for(var i = 0;i<(b-a) && i<that.length-a;i++){//这里需考虑截取数组的长度,如果单单只考虑i<(b-a),就会出现当b-a无限大,且a>0;数组中就会出现undefinedarr[i] = that[a+i];}}else{for(var i = 0;i<that.length-a;i++){arr[i] = that[a+i];}}return arr;};

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

原创粉丝点击