JS模拟实现ECMAScript5新增的数组方法
发布时间 - 2026-01-11 00:15:58 点击率:次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新增的数组方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# ecmascript
# 数组
# JavaScript常用数组操作方法
# 包含ES6方法
# JavaScript学习笔记之ES6数组方法
# JavaScript数组去重的几种方法详谈
# JS数组中常用方法技巧学会进阶成为大佬
# JS数组方法some、every和find的使用详情
# 详解JavaScript es6的新增数组方法
# 遍历
# 回调
# 跳过
# 法会
# 是从
# 小编
# 返回值
# 组中
# 就会
# 放在
# 在此
# 把它
# 给大家
# 会将
# 没有找到
# 转换为
# 所述
# 一区
# 给我留言
# 中会
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
简历没回改:利用AI润色让你的文字更专业
如何获取上海专业网站定制建站电话?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程
JavaScript如何实现继承_有哪些常用方法
java获取注册ip实例
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
如何在阿里云ECS服务器部署织梦CMS网站?
Laravel中的withCount方法怎么高效统计关联模型数量
linux top下的 minerd 木马清除方法
Android GridView 滑动条设置一直显示状态(推荐)
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
Laravel如何实现API资源集合?(Resource Collection教程)
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
EditPlus中的正则表达式 实战(2)
微信小程序 scroll-view组件实现列表页实例代码
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel如何使用查询构建器?(Query Builder高级用法)
简单实现jsp分页
JavaScript如何实现音频处理_Web Audio API如何工作?
如何在万网ECS上快速搭建专属网站?
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
如何在阿里云购买域名并搭建网站?
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
制作电商网页,电商供应链怎么做?
制作企业网站建设方案,怎样建设一个公司网站?
如何用JavaScript实现文本编辑器_光标和选区怎么处理
如何快速选择适合个人网站的云服务器配置?
原生JS实现图片轮播切换效果
如何在建站宝盒中设置产品搜索功能?
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何快速搭建高效服务器建站系统?
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
如何彻底卸载建站之星软件?
Mybatis 中的insertOrUpdate操作
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
如何正确选择百度移动适配建站域名?
移动端脚本框架Hammer.js
php结合redis实现高并发下的抢购、秒杀功能的实例
详解Oracle修改字段类型方法总结
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel如何使用Eloquent进行子查询
如何快速搭建个人网站并优化SEO?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程

