JavaScript几种循环速度及使用场景
一、for(正序和倒叙)
const million = 1000000;
const arr = Array(million);
for (let i = arr.length; i > 0; i--) {} // for(倒序) :- 1.5ms
for (let i = 0; i < arr.length; i++) {} // for :- 1.6ms
for倒叙略快。
for(倒序)只需要计算一次起始变量 let i = arr.length,而在正序的 for 循环中,它在每次变量增加后都会检查条件 i<arr.length。
数据量小时差别不大。如数据量达到十亿、百亿级时有明显差距
二、forEach / some
const arr = [1,2,3,4,5]
arr.forEach((item,index)=>{
console.log(item,index)
//1 0,
//2 1
//3 2
//4 3
//5 4
})
forEach不能结束和跳过循环;
三、for…of(es6)
const arr = [2, 3, 4];
const str = 'csdn';
for (let i of arr) {
console.log(i); // 输出 2, 3, 4
}
for (let i of str) {
console.log(i); // 输出 'c', 's', 'd', 'n'
}
//循环终止和跳出
let arr = ['apple', 'orange']
for(let i of arr) {
if(i == 'apple') {
continue;//跳出当前的循环,并不会终止;
}
return false;//终止循环 如果for循环中嵌套了for循环也将会终止
break;//用于跳出最近的一次循环,如果for循环中嵌套了for循环嵌套的循环将会继续执行
}
对一个可迭代的对象(例如 array、map、set、string 等)创建一个循环,特点:可读性好
四、for…in
let arr= [4, 5, 6];
for (let i in arr) {
console.log(i); // '0', '1', '2'
}
循环遍历对象的属性
五、其他
while
do…while
map
[1, 2, 3].map(function(elem, index, arr) {
return elem * index;
});
// [0, 2, 6]
filter()
some()
some()只要有一个是true,便返回true
every()
every()只要有一个是false,便返回false.
reduce(),reduceRight()
[1, 2, 3, 4, 5].reduce(function (a, b) {
console.log(a, b);
return a + b;
})
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15
Object.keys
var obj = {
p1: 123,
p2: 456
};
Object.keys(obj) // ["p1", "p2"]
总结
map(环和filter()循环都会跳过空位,for和while不会
var f = function (n) {
return 'a'
};
[1, undefined, 2].map(f) // ["a", "a", "a"]
[1, null, 2].map(f) // ["a", "a", "a"]
[1, , 2].map(f) // ["a", , "a"]
for 最快,但可读性比较差
forEach 比较快,能够控制内容,不可结束和跳过循环
for…of 常用,可读性好
for…in 比较慢