JavaScript数组方法的兼容性写法 汇总:indexOf()、forEach()、map()、filter()、some()、every()
ECMA Script5中数组方法如indexOf()、forEach()、map()、filter()、some()并不支持IE6~8,但是国内依然有一大部分用户使用IE6~8,而以上数组方法又确实非常好用。在过去,我会为了兼容性尽量不用这些方法。但是,总不能为了旧的丢了新的吧?!虽然说jQuery已经集成好了不少语法糖,但jQuery体积太庞大,作为一名志于体面的前端儿得知道原生的兼容性写法要怎么写。于是这几天,我开始在琢磨这些方法的兼容性写法。其实并不难,就是以前不够自信不敢写。写完以后,对数组认识更深一些了。总结见下文。
备注:以下兼容性写法均可兼容至IE6;
indexOf()
indexOf()方法 返回根据给定元素找到的第一个索引值,否则返回-1。
语法:
array.indexOf(searchElement[, fromIndex = 0])
参数:
searchElement // 位于数组中的元素;
fromIndex // 开始查找指定元素的索引值,默认值为 0 (即在整个数组中查找指定元素);
fromIndex大于或等于数组长度,则停止查找并返回-1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即-1表示从最后一个元素开始查找,-2表示从倒数第二个元素开始查找 ,以此类推。
兼容性:不兼容IE6~8。
根据indexOf()的语法写出兼容IE6~8的写法如下:
兼容性写法:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(ele) {
// 获取数组长度
var len = this.length;
// 检查值为数字的第二个参数是否存在,默认值为0
var fromIndex = Number(arguments[1]) || 0;
// 当第二个参数小于0时,为倒序查找,相当于查找索引值为该索引加上数组长度后的值
if(fromIndex < 0) {
fromIndex += len;
}
// 从fromIndex起循环数组
while(fromIndex < len) {
// 检查fromIndex是否存在且对应的数组元素是否等于ele
if(fromIndex in this && this[fromIndex] === ele) {
return fromIndex;
}
fromIndex++;
}
// 当数组长度为0时返回不存在的信号:-1
if (len === 0) {
return -1;
}
}
}
调用示例:
var arr = ["a", "b", "c"];
alert(arr.indexOf("b")); // 1
forEach()
forEach() 方法让数组的每一项都执行一次给定的函数。forEach()方法会修改原数组。
语法:
array.forEach(callback[, thisArg])
参数:
1 . callback :在数组每一项上执行的函数,接收三个参数:
currentValue(当前项的值)、index(当前项的索引)和array(数组本身)。
2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;
forEach 方法按升序为数组中含有效值的每一项执行一次callback 函数,那些已删除(使用delete方法等情况)或者从未赋值的项将被跳过(但不包括哪些值为 undefined 的项)。
兼容性:不兼容IE6~8。
根据forEach()的语法写出兼容IE6~8的写法如下:
兼容性写法:
if ( !Array.prototype.forEach) {
Array.prototype.forEach = function forEach(callback) {
// 获取数组长度
var len = this.length;
if(typeof callback != "function") {
throw new TypeError();
}
// thisArg为callback 函数的执行上下文环境
var thisArg = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this) {
// callback函数接收三个参数:当前项的值、当前项的索引和数组本身
callback.call(thisArg, this[i], i, this);
}
}
}
}
调用示例:
var arr = ["a", "b", "c", "a", "d", "a"];
arr.forEach(function(ele, index, array){
if(ele == "a") {
array[index] = "**";
}
});
alert(newArr); // ["**", "b", "c", "**", "d", "**"]
map()
map() 方法返回一个由原数组中的每个元素调用一个指定方法后的返回值组成的新数组。
语法:
array.map(callback[, thisArg])
参数:
1 . callback : 在数组每一项上执行的函数,接收三个参数:
currentValue(当前项的值)、index(当前项的索引)和array(数组本身);
2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;
兼容性:不兼容IE6~8。
根据map()的语法写出兼容IE6~8的写法如下:
兼容性写法:
if (!Array.prototype.map) {
Array.prototype.map = function(callback) {
// 获取数组长度
var len = this.length;
if(typeof callback != "function") {
throw new TypeError();
}
// 创建跟原数组相同长度的新数组,用于承载经回调函数修改后的数组元素
var newArr = new Array(len);
// thisArg为callback 函数的执行上下文环境
var thisArg = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this) {
newArr[i] = callback.call(thisArg, this[i], i, this);
}
}
return newArr;
}
}
调用示例:
var arr = ["a", "b", "c"];
var newArr = arr.map(function(ele, index, array){
ele += "12";
return ele;
});
alert(newArr); // ["a12", "b12", "c12"]
filter()
filter() 方法利用所有通过指定函数测试的元素创建一个新的数组,并返回。
语法:
arr.filter(callback[, thisArg])
参数:
1 . callback : 在数组每一项上执行的函数,接收三个参数:
currentValue(当前项的值)、index(当前项的索引)和array(数组本身);
2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;
filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 "true" 的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素只会被跳过,不会被包含在新数组中。filter 不会改变原数组。
兼容性:不兼容IE6~8。
根据filter()的语法写出兼容IE6~8的写法如下:
兼容性写法:
if (!Array.prototype.filter) {
Array.prototype.filter = function(callback) {
// 获取数组长度
var len = this.length;
if(typeof callback != "function") {
throw new TypeError();
}
// 创建新数组,用于承载经回调函数修改后的数组元素
var newArr = new Array();
// thisArg为callback 函数的执行上下文环境
var thisArg = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this) {
if(callback.call(thisArg, this[i], i, this)) {
newArr.push(val);
}
}
}
return newArr;
}
}
调用示例:
var arr = [1, 2, 3, 4, 3, 2, 5];
var newArr = arr.filter(function(ele, index, array){
if(ele < 3) {
return true;
}else {
return false;
}
});
alert(newArr); // [1, 2, 2]
some()
some() 方法测试数组中的某些元素是否通过了指定函数的测试。返回布尔值。some() 被调用时不会改变数组。
语法:
arr.some(callback[, thisArg])
参数:
1 . callback : 在数组每一项上执行的函数,接收三个参数:
currentValue(当前项的值)、index(当前项的索引)和array(数组本身);
2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;
some() 为数组中的每一个元素执行一次 callback 函数,直到找到一个使得 callback 返回一个true 的值。如果找到了这样一个值,some() 将返回 true。否则返回 false。
兼容性:不兼容IE6~8。
根据some()的语法写出兼容IE6~8的写法如下:
兼容性写法:
if (!Array.prototype.some) {
Array.prototype.some = function(callback) {
// 获取数组长度
var len = this.length;
if(typeof callback != "function") {
throw new TypeError();
}
// thisArg为callback 函数的执行上下文环境
var thisArg = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this && callback.call(thisArg, this[i], i, this)) {
return true;
}
}
return false;
}
}
调用示例:
var arr = [1, 2, 3, 4, 3, 2, 5];
var newArr = arr.some(function(ele, index, array){
if(ele < 2) {
return true;
}else {
return false;
}
});
alert(newArr); // true
every()
every() 方法测试数组的所有元素是否都通过了指定函数的测试。every() 不会改变原数组。
语法:
arr.every(callback[, thisArg])
参数:
1 . callback : 在数组每一项上执行的函数,接收三个参数:
currentValue(当前项的值)、index(当前项的索引)和array(数组本身);
2 . thisArg :可选参数。用来当作callback 函数内this的值的对象,即callback 函数的执行上下文;
every() 方法为数组中的每个元素执行一次 callback 函数。只有所有元素都在callback函数中返回true才返回true,否则返回false。
兼容性:不兼容IE6~8。
根据some()的语法写出兼容IE6~8的写法如下:
兼容性写法:
if (!Array.prototype.every) {
Array.prototype.every = function(callback) {
// 获取数组长度
var len = this.length;
if(typeof callback != "function") {
throw new TypeError();
}
// thisArg为callback 函数的执行上下文环境
var thisArg = arguments[1];
for(var i = 0; i < len; i++) {
if(i in this && !callback.call(thisArg, this[i], i, this)) {
return false;
}
}
return true;
}
}
调用示例:
var arr = [1, 2, 3, 4, 3, 2, 5];
var newArr = arr.every(function(ele, index, array){
if(ele < 3) {
return true;
}else {
return false;
}
});
alert(newArr); // false
本文作者:子匠_Zijor,转载请注明出处:http://www.dengzhr.com/js/362
JavaScript数组方法的兼容性写法 汇总:indexOf()、forEach()、map()、filter()、some()、every()的更多相关文章
- 【译】你应该了解的JavaScript数组方法
让我们来做一个大胆的声明:for循环通常是无用的,而且还导致代码难以理解.当涉及迭代数组.查找元素.或对其排序或者你想到的任何东西,都可能有一个你可以使用的数组方法. 然而,尽管这些方法很有用,但是其 ...
- JavaScript数组方法大全(推荐)
原网址:http://www.jb51.net/article/87930.htm 数组在笔试中经常会出现的面试题,javascript中的数组与其他语言中的数组有些不同,为了方便之后数组的方法学习, ...
- 2018.2.27 JavaScript数组方法应用
JavaScript数组方法应用 1.找出元素item在给定数组arr中的位置 function indexOf(arr,item){ return arr.indexOf(item); } func ...
- JavaScript数组方法详解
JavaScript数组方法详解 JavaScript中数组的方法种类众多,在ES3-ES7不同版本时期都有新方法:并且数组的方法还有原型方法和从object继承的方法,这里我们只介绍数组在每个版本中 ...
- JavaScript数组方法大集合
JavaScript数组方法集合 本文总结一下js数组处理用到的所有的方法.自己做个笔记. 数组方法 concat() 合并两个或多个数组 concat()能合并两个或者多个数组,不会更改当前数组,而 ...
- 一站式超全JavaScript数组方法大全
一站式JavaScript数组方法大全(建议收藏) 方法一览表 详细操作 本人总结了JavaScript中有关数组的几乎所有方法(包含ES6之后新增的),并逐一用代码进行演示使用,希望可以帮助大家! ...
- JavaScript数组方法--every、some、fill
接上一篇,JavaScript数组方法--concat.push,继续其他的数组方法. every:every() 方法测试数组的所有元素是否都通过了指定函数的测试. 先看其使用方法: functio ...
- JavaScript 数组方法处理字符串 prototype
js中数组有许多方法,如join.map,reverse.字符串没有这些方法,可以“借用”数组的方法来处理字符串. <!doctype html> <html lang=" ...
- JavaScript数组方法速查,32个数组的常用方法和属性
JavaScript数组方法速查手册极简版 http://30ke.cn/doc/js-array-method JavaScript数组方法速查手册极简版中共收了32个数组的常用方法和属性,并根据方 ...
随机推荐
- python线程入门
目录 python线程入门 线程与进程 线程 总结 参考 python线程入门 正常情况下,我们在启动一个程序的时候.这个程序会先启动一个进程,启动之后这个进程会启动起来一个线程.这个线程再去处理事务 ...
- 编写高质量 JavaScript -- 知识点小记
一: 团队合作避免JS冲突 脚本中的变量随时存在冲突的风险, 1. 解决办法---用匿名函数将脚本包起来,让变量的作用域控制在匿名函数之内 如: <script type="tex ...
- Golang 知识图谱
- HDU 5253 连接的管道(Kruskal算法求解MST)
题目: 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老天格外的不开眼,大旱.所以老 Jack 决定用管道将他的所有相邻的农田全部都串联起来,这样他就可以从远处引水过来进行灌溉了.当老 J ...
- webbrowser打开新窗口事件+=
测试可用: private void SaveSnapshot_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(txturl ...
- [转]使用BCP导出导入数据
本文转自:http://www.cnblogs.com/zerocc/p/3225723.html bcp 实用工具可以在 Microsoft SQL Server 实例和用户指定格式的数据文件间大容 ...
- WPF进度条
ProgressBar控件与传统WinForm使用方法完全一样,我们只需关注: Minimum——最小值,默认为0: Maximum——最大值,默认为100. Value——当前值. 关键是它的控 ...
- Oracle官网下载参考文档
最近有人问我有没有Oracle11g数据库官方参考文档,我就想,这不是在官网可以下载到的吗,疑惑,问了之后才知道,他官网找过,但时没有找到.不要笑,其实有很多人一样是找不到的,下面就一步一步操作下: ...
- Dubbo安装及其实战1
一.Dubbo安装 (1)安装zk和tomcat yum 安装tomcat 默认路径为 /usr/share/tomcat zookeeper 我这里采用的是使用zookeeper管理的.所以要安装z ...
- Oracle扩容日志文件
0.检查当前数据库日志切换频率 select * from v$log_history where first_time>=to_date('2017-10-18','yyyy-mm-dd') ...