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 相关文章推荐
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
Jquery时间验证和转换工具小例子
Jul 01 Javascript
javaScript array(数组)使用字符串作为数组下标的方法
Nov 19 Javascript
深入理解JavaScript系列(33):设计模式之策略模式详解
Mar 03 Javascript
js+cookies实现悬浮购物车的方法
May 25 Javascript
Bootstrap模态框禁用空白处点击关闭
Oct 20 Javascript
Bootstrap框架实现广告轮播效果
Nov 28 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
Dec 22 Javascript
ES6入门教程之let和const命令详解
May 17 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 Javascript
vue实现简单的登录弹出框
Oct 26 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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
Javascript之文件操作
2007/03/07 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
6个DIV 135或246间隔一秒轮番显示效果
2010/07/24 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
JavaScript之WebSocket技术详解
2016/11/18 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
基于Vue实现的多条件筛选功能的详解(类似京东和淘宝功能)
2019/05/07 Javascript
Vue.js实现大屏数字滚动翻转效果
2019/11/29 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
简单实现python画圆功能
2018/01/25 Python
shell命令行,一键创建 python 模板文件脚本方法
2018/03/20 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
python爬虫 urllib模块发起post请求过程解析
2019/08/20 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
为什么要使用servlet
2016/01/17 面试题
鸦片战争观后感
2015/06/09 职场文书
2015年数学教研工作总结
2015/07/22 职场文书
文书工作总结(范文)
2019/07/11 职场文书