JS模拟实现ECMAScript5新增的数组方法


Posted in Javascript onMarch 20, 2017

ECMAScript5 新增了十个数组方法,这些方法只有在ie9及以上浏览器中可以被使用,下面是对于这些方法的模拟实现。

一、Array.isArray(element)

该方法用于判断传入的对象是否为数组类型,返回true和false。

Array.newIsArray = function(element){
  return Object.prototype.toString.call(element).slice(8,-1).toLocaleLowerCase() === 'array';
}

二、.indexOf(element)

该方法用于查找传入对象在数组中的位置,并返回该位置,若没有找到则返回-1,该方法不能用于寻找undefined。

indexOf方法可以和~符配合使用。按位运算符~会将传入数字取反并减一,所以-1就会变成0,这时候把它放在判断条件中会被隐式转换为false。

Array.prototype.newIndexOf = function(element){
  var index = -1;
  for(var i = 0; i < this.length; i++){
    if(this[i] === element && this[i] !== undefined){
      index = i;
      break;
    }
  }
  return index;
};
var a = [1,2,3,4,,,5];
console.log(a.newIndexOf(undefined));

三、lastIndexOf(element)

该方法与indexOf(element)作用和返回值相同,唯一不同的地方是它是从右向左寻找。

Array.prototype.newLastIndexOf = function(element){
  var index = -1;
  for(var i = this.length - 1; i >= 0; i--){
    if(this[i] === element && this[i] !== undefined){
      index = i;
      break;
    }
  }
  return index;
};
var a = [1,2,3,4,5,2,,,3];
console.log(a.newLastIndexOf(undefined));

四、forEach(function(element, index, array){})

遍历数组,参数为一个回调函数,有三个传参:当前元素、当前元素索引、整个数组,该方法会跳过保留缺失成员,不会破坏原数组。

Array.prototype.newForEach = function(fn){
  for(var i = 0; i < this.length; i++){
    if(i in this){
      fn(this[i], i, this);
    }
  }
};
var a = [1,2,3,undefined,undefined,4,5,2,3];
a.forEach(function(e, i, arr){
  console.log(e, i, arr);
})

五、every(function(element, index, array){})

使用传入的回调函数遍历数组,当所有回调都返回true时,every方法返回true,否则返回false。该方法会跳过保留缺失成员,不会破坏原数组。

Array.prototype.newEvery = function(fn){
  var status = true;
  for(var i = 0; i < this.length; i++){
    if(i in this){
      if(!(status = !!fn(this[i], i, this))){
        break;
      }
    }
  }
  return status;
};
var a = [1,2,3,4,5,2,undefined,,3];
console.log(a.newEvery(function(){
  console.log(arguments);
  return 1;
}));

 六、some(function(element, index, array){})

使用传入的回调函数遍历数组,当有回调返回true时,some方法返回true,否则返回false。该方法会跳过保留缺失成员,不会破坏原数组。

Array.prototype.newSome = function(fn){
  var status = false;
  for(var i = 0; i < this.length; i++){
    if(i in this){
      if(status = !!fn(this[i], i, this)){
        break;
      }
    }
  }
  return status;
};
var a = [1,2,3,4,5,2,undefined,,3];
console.log(a.newSome(function(){
  console.log(arguments);
  return 0;
}));

 七、map(function(element, index, array){})

使用传入的回调函数遍历数组,使用遍历数组返回的内容组成一个新的数组,该方法会跳过空元素,但是最终结果保留缺失成员的位置,不会破坏原数组。

Array.prototype.newMap = function(fn){
  var array = new Array(this.length);
  for(var i = 0; i < this.length; i++){
    if(i in this){
      array[i] = fn(this[i], i, this);
    }
  }
  return array;
};
var a = [1,2,3,4,5,2,undefined,,3];
console.log(a.newMap(function(element, index, array){
  console.log(arguments);
  return element;
}))

八、filter(function(element, index, array){})

使用传入的回调函数遍历数组,最终返回一个新数组,该数组中包含所有回调函数返回true的元素,不会破坏原数组。

Array.prototype.newFilter = function(fn){
  var array = [];
  for(var i = 0; i < this.length; i++){
    if((i in this) && fn(this[i], i, this)){
      array.push(this[i]);
    }
  }
  return array;
};
var a = [1,2,3,4,5,2,undefined,,3];
console.log(a.newFilter(function(element, index, array){
  console.log(arguments);
  return element;
}))

九、reduce(function(accumulator, currentValue, currentIndex, array){})

使用传入的回调函数遍历数组,返回最后一个回调函数调用的返回值,跳过缺失成员,不会破坏原数组。 

Array.prototype.newReduce = function(fn){
  if(this.length === 0){
    throw new TypeError('Reduce of empty array with no initial value');
  }
  var result;
  for(var i = 0; i < this.length; i++){
    if(i in this){
      if(!result){
        result = this[i];
      }else{
        result = fn(result, this[i], i, this);
      }
    }
  }
  return result;
};
var a = [,,1,2,3,4,,6,7];
console.log(a.newReduce(function(a,b){
  console.log(arguments);
  return a + b;
}))

十、reduceRight(function(accumulator, currentValue, currentIndex, array){})

该方法作用于reduce相同,唯一区别是它是从右往左开始遍历。

Array.prototype.newReduceRight = function(fn){
  if(this.length === 0){
    throw new TypeError('Reduce of empty array with no initial value');
  }
  var result;
  for(var i = this.length - 1; i >= 0; i--){
    if(i in this){
      if(!result){
        result = this[i];
      }else{
        result = fn(result, this[i], i, this);
      }
    }
  }
  return result;
};
var a = [,,1,2,3,4,,6,7];
console.log(a.newReduceRight(function(a,b){
  console.log(arguments);
  return a + b;
}))

以上所述是小编给大家介绍的JS模拟实现ECMAScript5新增的数组方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js change,propertychange,input事件小议
Dec 20 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
原生js实现键盘控制div移动且解决停顿问题
Dec 05 Javascript
Three.js基础部分学习
Jan 08 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 Javascript
RequireJS用法简单示例
Aug 20 Javascript
vue与原生app的对接交互的方法(混合开发)
Nov 28 Javascript
js比较两个单独的数组或对象是否相等的实例代码
Apr 28 Javascript
详解新手使用vue-router传参时注意事项
Jun 06 Javascript
JavaScript实现单图片上传并预览功能
Sep 30 Javascript
原生js实现html手机端城市列表索引选择城市
Jun 24 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 Javascript
JavaScript 过滤关键字
Mar 20 #Javascript
Extjs表单输入框异步校验的插件实现方法
Mar 20 #Javascript
js实现鼠标拖动功能
Mar 20 #Javascript
基于vue2的table分页组件实现方法
Mar 20 #Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 #Javascript
基于vue.js实现侧边菜单栏
Mar 20 #Javascript
微信小程序 参数传递实例代码
Mar 20 #Javascript
You might like
DC最新动画电影:《战争之子》为何内容偏激,毁了一个不错的漫画
2020/04/09 欧美动漫
人尽可用的Windows技巧小贴士之下篇
2007/03/22 PHP
linux php mysql数据库备份实现代码
2009/03/10 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
php,js,css字符串截取的办法集锦
2014/09/26 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
javascript等号运算符使用详解
2015/04/16 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
vue的基本用法与常见指令
2017/08/15 Javascript
jQuery实现获取及设置CSS样式操作详解
2018/09/05 jQuery
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
ES6 proxy和reflect的使用方法与应用实例分析
2020/02/15 Javascript
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
[56:56]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
eBay加拿大站:eBay.ca
2019/06/20 全球购物
用JAVA SOCKET编程,读服务器几个字符,再写入本地显示
2012/11/25 面试题
电力安全事故反思
2014/04/27 职场文书