js中的内置方法的兼容写法
1、如果浏览器不支持every属性,every的实现原理
if(Array.prototype.every===undefined){ Array.prototype.every=function(fun){ //遍历当前数组中每个元素 for(var i=0;i<this.length;i++){ if(this[i]!==undefined){ //调用fun,依次传入当前元素值,位置i,当前数组作为参数 ,将返回值,保存在变量r中 var r=fun(this[i],i,this); if(r==false){//如果r为false return false;//返回false } } }//(遍历结束) return true;//返回true } }
2、如果浏览器不支持some属性,some的实现原理
if(Array.prototype.some===undefined){ Array.prototype.some=function(fun){ for(var i=0;i<this.length;i++){ if(this[i]!==unefined){ var r=fun(this[i],i,this); if(r==true){ return true; } } } return false; } }
3、浏览器不支持map属性,map的实现原理
if(Array.prototype.map===undefined){ Array.prototype.map=function(fun){ //创建空数组: newArr var newArr=[]; //遍历当前数组中每个元素 for(var i=0;i<this.length;i++){ //如果当前元素不是undefined if(this[i]!==undefined){//判断稀疏数组 //调用fun传入当前元素值,位置i,当前数组,将结果保存在r中 //将newArr的i位置赋值为r var r=fun(this[i],i,this); newArr[i]=r; } }//(遍历结束) return newArr;//返回newArr } }
4、如果浏览器不支持reduce属性,reduce的实现原理
if(Array.prototype.reduce===undefined){ Array.prototype.reduce=function(fun,base){ base===undefined&&(base=0); for(var i=0;i<this.length;i++){ if(this[i]!==undefined){ base=fun(base,this[i],i,this); } } return base; } }
5、如果浏览器不支持bind属性, bind函数的实现原理
if(Function.prototype.bind===undefined){ Function.prototype.bind=function(obj/*,参数列表*/){ var fun=this;//留住this //*****将类数组对象,转化为普通数组 var args=Array.prototype.slice.call(arguments,1); //args保存的就是提前绑定的参数列表 /*function slice(1){ var sub=[]; for(var i=0;i<length;i++){ sub.push(arguments[i]); } return sub; }*/ return function(){ //将后传入的参数值,转为普通数组 var innerArgs=Array.prototype.slice.call(arguments);//将之前绑定的参数值和新传入的参数值,拼接为完整参数之列表 var allArgs=args.concat(innerArgs) //调用原始函数fun,替换this为obj,传入所有参数 fun.apply(obj,allArgs); } } }