思路:判断Array的原型对象里是否有该api,没有则添加此api
代码如下:
var arr=[2,,4,5]
if(typeof Array.prototype.forEach!=="function"){
Array.prototype.forEach=function(fn){
for(var i=0;i<this.length;i++){
if(this[i]!==undefined) //防止稀疏数组
fn(this[i],i,this)
}
}
}
arr.forEach(function(elem,i,arr){
arr[i]=elem*2;
})
document.write(arr)
解析:fn是一个回调函数,通过for循环把当前的元素,位置,数组作为fn的参数,fn可以获得来调用forEach的数组的当前位置和元素,然后我们调用forEach的时候,又写了回调函数fn里面执行的代码(这里是执行了elem*2,然后把结果又赋值给当前元素,所以直接修改了原数组)
map的原理,代码如下,因为和forEach差不多,不陈述了
if(typeof Array.prototype.map!=="function"){
Array.prototype.map=function(fn){
var arr=[];
for(var i=0;i<this.length;i++){
if(this[i]!==undefined)
arr[i]=fn(this[i],i,this)
}
return arr;
}
}
var newArr=arr.map(function(elem,i,arr){
return elem*2
});
filter的原理代码如下
var arr=[2,3,4,5]
//筛选偶数出来,返回新数组,不改变原数组
if(typeof Array.prototype.my_filter!=="function"){
Array.prototype.my_filter=function(fn){
var arr=[]
for(var i=0;i<this.length;i++){
fn(this[i],i,this)&&arr.push(this[i])
}
return arr;
}
}
var new_arr=arr.my_filter(function(elem,i,arr){
return elem%2==0;
})
console.log(new_arr)
reduce的原理,代码如下
var arr1=[1,2,3]
if(typeof Array.prototype.my_reduce!=="function"){
Array.prototype.my_reduce=function(fn,base){
base===undefined&&(base=0)
var prev=base;
for(var i=0;i<this.length;i++){
prev=fn(prev,this[i],i,this);
}
return prev;
}
}
var a=arr1.my_reduce(function(prev,elem,i,arr){
return prev+elem;
},100)
console.log(a)//106
这个需要解析,比前面的稍难理解,首先要明白prev是什么,prev是指当前的汇总和,包含了第二个参数,不包含当前元素。因为每次和当前元素相加完马上覆盖了之前的prev,所以最终相当于第二个参数加上整个数组的和
下面是indexof的代码原理
//判断浏览器是否有api indexOf
if(typeof Array.prototype.indexOf!=="function"){
//没有该api则为原型对象添加该api
Array.prototype.indexOf=function(elem,fromi=0){
//fromi==undefined&&(fromi=0);
//this指将来调用该api的.前的子对象
for(var i=fromi;i<this.length;i++){
if(this[i]==elem) return i;
}
return -1;
}
}
版权声明:本文为weixin_44494811原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。