关于javascript中的循环

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

// 以上两种新建数组的结果并不一样,fill新建数组中的每一项指向的都是一个内存地址。

你可能感兴趣的:(JavaScript,javascript)