JS遍历方法性能比较

2020-05-18  本文已影响0人  伪球迷也是球迷啊

考虑游览器版本,内核优化,数据会有偏差;各个循环适用条件场景,优缺点,性能消耗

创建一个10w条数据的数组,遍历该数组,取出所有value,比较性能

const arr = [];
const values = [];
const length = 1000000;
for (let i = 0; i < length; i++) {
    arr.push({
        id: i + 1,
        value: `text${i+1}`
    });
}

for循环 js中最原始的遍历方法

// 使用let定义i为块级作用域,break,continue,return;
console.time('for');
for (let i = 0; i < arr.length; i++) {
    values.push(arr[i].value);
}
console.timeEnd('for');

==38.739ms==


// for循环优化版本,length用变量定义,不需要每次查找数组长度
console.time('forBest');
for (var i = 0, len = arr.length; i < len; i++) {
    values.push(arr[i].value);
}
console.timeEnd('forBest');

==28.186ms==

while

// while循环,一般用不不确定循环次数,对比for循环,for中局部变量在循环结束后会被释放回收;while需要在循环之前定义好变量;性能接近;
console.time('while');
var i = 0;
while (i < arr.length) {
    values.push(arr[i].value);
    i++;
}
console.timeEnd('while');

==29.187ms==

map

// map循环 ,返回新数组,不改变原数组值
console.time('map');
let a = arr.map(item => {
    return item.value;
});
console.timeEnd('map');

==48.471ms==

forEach

// forEach循环,不改变原数组 ,不能使用break语句中断循环,也不能使用return语句返回到外层函数,可以try catch
console.time('forEach');
arr.forEach((item, key) => {
    values.push(item.value);
});
console.timeEnd('forEach');

==54.872ms==

++综合以上数据第一梯队:while,for优化,for;第二梯队: map,forEach++

filter

// 不改变原数组,返回的是符合项组成新数组,不会跳出循环
console.time('filter');
arr.filter((item, key) => {
    return item.id > 0;
});
console.timeEnd('filter');

==91.107ms==

reduce

// 求和,求最大值,转换数组
// array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue);
// currentIndex 有初始值从0开始,没有从1开始
console.time('reduce');
const a = arr.reduce((preValue, current) => {
    preValue.push(current.value);
    return preValue;
}, []);
console.timeEnd('reduce');

==74.425ms==

for of

// 遍历具有iteratoer接口属性的数据,比如Array,map,set,不能用于object,可以用break、continue和return 配合使用,获取到的是值

some

// 对数组中每一项遍历,只要有一项返回true,则返回true, 返回值为布尔值
console.time('some');
arr.some((item, key) => {
    return item.id > 1;
});
console.timeEnd('some');

every

// 对数组中每一项遍历,每一项返回true,则返回true, 返回值为布尔值
console.time('every');
arr.every((item, key) => {
    return item.id > 1;
});
console.timeEnd('every');

数组查询方法 find indexOf includes

find() 方法返回数组中满足提供的测试函数的第一个元素的值;
indexOf()方法返回在数组中可以找到给定元素的第一个索引,如果不存在,则返回-1;
includes() 方法用来判断当前数组是否包含某指定的值,返回值boolean

对象遍历

for in

// 遍历的是索引(键名),既可遍历对象,也可遍历数组。遍历数组时也会遍历可枚举的其他方法,所以不推荐 for..in遍历数组, 遍历数组,break、continue和return;
可以用obj.hasOwnPropery()判断是实例属性

values,keys, entries, Reflect.ownKeys()

// keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历
// Object.keys返回所有不可枚举属性的key,Reflect.ownKeys返回所有属性,包括symbol属性
上一篇 下一篇

猜你喜欢

热点阅读