JavaScript中数组对象的那些自带方法介绍(2)


[1, 2].forEach(function(value, index, array) {
console.log(value, index, array);
});
// return
// 1 0 [1, 2]
// 2 1 [1, 2]


Note:forEach是无法通过break来中断数组的遍历。
解决方法:利用try方法来抛出异常,终止遍历。

复制代码 代码如下:


try {
[1,2,3].forEach(function(val) {
console.log(val);
throw(e)
});
} catch(e) {
console.log(e);
}


map *[ECMAScript 5]
Array.map(callback[, thisArg]); // 遍历数组元素,调用指定函数,并以数组返回所有结果
参数:
callback:遍历数组时调用的函数
thisObject :指定 callback 的作用域
例子:

复制代码 代码如下:


[1, 2, 3].map(function(num) { // return [2, 3, 4]
return num + 1;
});


filter *[ECMAScript 5]

复制代码 代码如下:


Array.filter(callback[, thisObject]); // 遍历数组调用方法,满足条件(返回true)的元素,将被添加到返回值的数组中


参数:
callback:遍历数组时调用的函数
thisObject :指定 callback 的作用域
例子:

复制代码 代码如下:


[1, 2, 3].filter(function(num) { // return [1]
return num < 2;
});


every 和 some *[ECMAScript 5]

复制代码 代码如下:


Array.every(callback[, thisObject]); // “与”
Array.some(callback[, thisObject]); // “或”


参数:
callback:遍历数组时调用的函数
thisObject:指定 callback 的作用域
every:当所有元素调用函数都返回true,结果才返回true,不然均返回false。
some:当所有元素调用函数都返回false,结果才返回false,不然均返回true。
一旦every和some的返回值确定,就会立刻停止遍历。
例子:

复制代码 代码如下:


[1, 2, 3]. every(function(num) { // return false
return num > 1;
});
[1, 2, 3]. some(function(num) { // return true
return num > 2;
});


reduce 和 reduceRight *[ECMAScript 5]

复制代码 代码如下:


Array.reduce(callback[, initialValue]); // 使用指定的方法将数组元素进行组合,按索引从低到高(从左到右)
Array.reduceRight(callback[, initialValue]); // 使用指定的方法将数组元素进行组合,按索引从高到低(从右到左)


参数:
callback:遍历数组时调用的函数
initialValue:第一个次调用callback时传入的previousValue
另外,callback会调用四个参数:
previousValue:到目前为止的操作累积结果
currentValue:数组元素
index:数组索引
array:数组本身
例子:
[1, 2, 3]. reduce(function(x, y) { // return 106
return x + y;
}, 100);
--------------------------------------------------------------------------------
性能测试
测试系统:Windows 7
测试浏览器:Chrome 26.0.1386.0

复制代码 代码如下:


var arr = [];

for(var i = 0; i < 999999; i++) {
arr.push(i);
}


forEach

复制代码 代码如下:


function forEachTest() {
howTime("forEach", function() {
var num = 0;
arr.forEach(function(val, key) {
num += val;
});
});
howTime("for", function() {
var num = 0;
for(var i = 0, len = arr.length; i < len; i++) {
num += arr[i];
}
});
}


下面是随机进行的3次测试结果(具体结果与电脑配置有关,结果越小则性能越好):
time_forEach   time_for  
1421.000ms    64.000ms   
1641.000ms    63.000ms   
1525.000ms    63.000ms   

可以看到,Chrome并没有对forEach做专门的优化,和直接用for循环遍历相比,性能还是有很大的差距。
因为forEach是 ECMAScript 5 的东西,旧版浏览器并不支持。
不过MDN都有给出向下兼容的解决方法:

复制代码 代码如下:


if(!Array.prototype.forEach) {
Array.prototype.forEach = function(fn, scope) {
for(var i = 0, len = this.length; i < len; ++i) {
fn.call(scope, this[i], i, this);
}
}
}


离谱的是,原生的 forEach 方法,在性能上,居然比不上自己构造的 forEach!
还有,其他Array对象其他的迭代方法呢?
大家看看这个Demo就基本清楚了:
另外,还发现了一个有意思的情况。
如果直接在控制台运行Demo的JavaScript代码,你会发现性能上有很大差异!
这个时候,直接用for循环写的方法,性能会更差。
对于这个疑问,在知乎上提问了,问题地址:

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wddwzg.html