- for循环的执行效率最高,forEach是for循环的8.8倍,for of是for循环的11倍,for in是for循环的2100倍,map是for循环的3.6倍,while/do while是for循环的1.8倍。
- 在使用for循环时,提前将数组length缓存起来,可提高for循环效率15%。同时也要注意循环体中如果对原数组的长度进行了增删,还是需要保证每次循环动态获取数组长度,或者手动给len重新赋值,避免出现undefined报错或新增数组项未遍历的情况。
for (let i=0,len=array.length;i<len;i++) {
array.shift()
len--
array.push('item')
len++
len = array.length
}
- for循环体中如果出现splice删除的情况,记得同步更新遍历下标。有删除的情况不要使用forEach,因为下标更新不了
for (let i=0;i<array.length;i++) {
if (i > 5) {
array.splice(i, 1)
i--
}
}
- for循环要比链式操作的效率更高,尤其是加上break和continu
- 数组项为非引用型,只有array[i]的形式可以改变数组项,forEach、for of等element直接赋值无法改变。如果是引用型,forEach、for of可通过element直接修改。map都不行,但都可以通过return返回给新数组。
- 稀疏数组遍历,forEach和for in会跳过empty项,少执行一次。
- forEach() 期望的是一个同步函数,它不会等待 Promise 兑现。
- 除非抛出异常,否则没有办法停止或中断 forEach() 循环。如果有这样的需求,则不应该使用 forEach() 方法。可以通过像 for、for…of 和 for…in 这样的循环语句(break,continue)来实现提前终止。当不需要进一步迭代时,诸如 every()、some()、find() 和 findIndex() 等数组方法也会立即停止迭代。
try {
array.forEach((item, index) => {
if (true) {
throw new Error('');
} else {
console.log(item)
}
})
} catch (err) {}
- for in的index是字符串型,将下标作为了key
- 注意fill填充的引用型
const array1 = new Array(2).fill({ age: 1 })
const array2 = [{age: 1}, {age: 1}]