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中的数学函数
Apr 04 Javascript
重构Javascript代码示例(重构前后对比)
Jan 23 Javascript
JS操作数据库的实例代码
Oct 17 Javascript
前端框架Vue.js中Directive知识详解
Sep 12 Javascript
网页中右键功能的实现方法之contextMenu的使用
Feb 20 Javascript
详解VUE的状态控制与延时加载刷新
Mar 27 Javascript
Vue.js展示AJAX数据简单示例讲解
Mar 29 Javascript
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
浅谈JavaScript作用域和闭包
Sep 18 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 Javascript
Vue入门学习笔记【基本概念、对象、过滤器、指令等】
Apr 13 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
Feb 03 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
欧美媒体选出10年前最流行的17部动画
2017/01/18 日漫
一个分页的论坛
2006/10/09 PHP
PHP 和 XML: 使用expat函数(三)
2006/10/09 PHP
用PHP读取flv文件的播放时间长度
2009/09/03 PHP
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
Javascript MD4
2006/12/20 Javascript
用javascript控制iframe滚动的代码
2007/04/10 Javascript
JavaScript初学者应注意的七个细节详细介绍
2012/12/27 Javascript
特殊情况下如何获取span里面的值
2014/05/20 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
js原生日历的实例(推荐)
2017/10/31 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
python实现汉诺塔方法汇总
2016/07/25 Python
python实现二叉树的遍历
2017/12/11 Python
python实现梯度下降算法
2020/03/24 Python
Python读取txt内容写入xls格式excel中的方法
2018/10/11 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python简单区块链模拟详解
2019/07/03 Python
使用python实现对元素的长截图功能
2019/11/14 Python
pycharm 激活码及使用方式的详细教程
2020/05/12 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
IWOOT美国:新奇的小玩意
2018/04/27 全球购物
学生实习推荐信范文
2013/11/26 职场文书
服装机修工岗位职责
2013/12/26 职场文书
英语专业个人求职信范文
2014/02/01 职场文书
开学寄语大全
2014/04/08 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
名人传读书笔记
2015/06/26 职场文书
《法国号》教学反思
2016/02/22 职场文书