文章目录
ECMAScript 5 中的数组方法
ECMAScript 5定义了9个新的数组方法来遍历、映射、过滤、检测、简化和搜索数组。
forEach()
方法
forEach()
方法从头至尾遍历数组,为每个元素调用指定的函数。
注意, forEach()
无法在所有元素都传递给调用的函数之前终止遍历。
如果要提前终止,必须把forEach()
方法放在一个try块中,并能抛出一个异常。如果forEach()
调用的函数抛出 foreach.break 异常,循环会提前终止:
function foreach(a,f,t) {
try { a.forEach(f,t); }
catch(e) {
if (e === foreach.break) return;
else throw e;
}
}
foreach.break = new Error("StopIteration");
map()
方法
map()
方法将调用的数组的每个元素传递给指定的函数,并返回一个新数组,它包含该函数的返回值。
filter()
方法
filter()
方法返回的数组元素是调用的数组的一个子集。
传递的函数是用来逻辑判断的:该函数返回true或false。如果返回值为true(或能转化为true值),那么传递给判定函数的元素就是这个子集的成员,它将被添加到一个作为返回值的数组中。
注意, filter()
会跳过稀疏数组中缺少的元素,它的返回数组总是稠密的。
- 压缩稀疏数组的空缺:
var dense = sparse.filter(function() { return true; });
- 压缩空缺并删除undefined和null元素:
var a = a.filter(function(x) { return x !== undefined && x != null; });
every()
和some()
方法
every()
和some()
方法是数组的逻辑判定:它们对数组元素应用指定的函数进行判定,返回true或false。
(注意,一旦every()
和some()
确认该返回什么值它们就会停止遍历数组元素)
-
every()
方法当且仅当针对数组中的所有元素调用判定函数都返回true,它才返回true;一旦有一个判定函数返回false,它立即返回false。 -
some()
方法当数组中至少有一个元素调用判定函数返回true,他就返回true;并且当且仅当数值中的所有元素调用判断函数都返回false,它才返回false。注意,根据数学上的惯例,在空数组上调用时,
every()
返回true,some()
返回false。
reduce()
和reduceRight()
方法
reduce()
和reduceRight()
方法使用指定的函数将数组元素进行组合,生成单个值。这在函数式编程中是常见的操作,也可称为‘注入’和折叠。
-
reduce()
需要两个参数。第一个是执行化简操作的函数(化简函数的任务就是用某种方法把两个值组合或化简为一个值,并返回化简后的值)。第二个参数(可选)是一个传递给函数的初始值(不传时,将使用数组第一个元素作为初始值)。在空数组上,不带初始值参数调用
reduce()
将导致类型错误异常。
如果调用它的时候只有一个值(数组只有一个元素并且没有指定初始值,或者有一个空数组并且指定一个初始值)reduce()
只是简单地返回那个值而不会调用化简函数。
reduceRight()
的工作原理和reduce()
一样,不同的是它按照数组索引从高到低(从右到左)处理数组,而不是从低到高。
indexOf()
和lastIndexOf()
indexOf()
和lastIndexOf()
搜索整个数组中具有给定值的元素,并返回找到的第一个元素的索引(没找到就返回-1)。
第一个参数是需要搜索的值,第二个参数是可选的:它指定数组中的一个索引,从哪里开始搜索。
判断数组和类数组
在ECMAScript 5 中可以用Array.isArray()
函数判断一个未知对象是否为数组。
var isArray = Function.isArray || function(o) {
return typeof o === "object" && Object.prototype.toString.call(o) === "[object Array]";
};
arguments 类数组对象和 DOM 方法返回的类数组对象:
function isArrayLike(o) {
if (o && // o非null, undefined等
typeof o === "object" && // o是对象
isFinite(o.length) && // o.length是有限数值
o.length >= 0 && // o.length 为非负数
o.length === Math.floor(o.length) && // o.length 是整数
o.length < 4294967296 ) // o.length < 2^32
return true; // o是类数组对象
else
return false; // o不是类数组对象
}