面试题答案
一键面试1. for 循环
- 使用场景:适用于已知循环次数,对数组、类数组对象等进行常规遍历,例如遍历数组获取每个元素的平方。
- 性能:性能较好,尤其是在现代JavaScript引擎优化后。因为它是最基础的循环方式,没有额外函数调用开销。
- 对迭代器的支持:不依赖迭代器,通过索引访问元素,可用于非迭代器对象(只要有索引访问方式)。
2. for...of 循环
- 使用场景:专门用于遍历可迭代对象,如数组、字符串、Set、Map等,简洁地获取可迭代对象的每一个值。例如遍历Set集合获取每个成员。
- 性能:性能与 for 循环相近,在处理可迭代对象时代码更简洁。
- 对迭代器的支持:依赖迭代器协议,会自动使用对象的迭代器来遍历,只能用于实现了迭代器协议的对象。
3. for...in 循环
- 使用场景:主要用于遍历对象的可枚举属性,包括对象自身和继承的可枚举属性。例如遍历一个普通对象,获取所有属性名。
- 性能:性能相对较差,因为它不仅遍历自身属性,还可能遍历到继承属性,并且每次迭代需要查找原型链。
- 对迭代器的支持:不依赖迭代器,用于对象属性遍历,不适用于可迭代对象的常规值遍历。
4. forEach 方法
- 使用场景:适用于数组,对数组每个元素执行相同操作,不需要返回新数组。例如为数组每个元素打印日志。
- 性能:性能略低于 for 循环,因为每次迭代都有函数调用开销。
- 对迭代器的支持:不依赖迭代器,仅用于数组,内部通过索引遍历数组。
5. map 方法
- 使用场景:用于数组,创建一个新数组,其结果是该数组中每个元素都调用一个提供的函数后返回的结果。例如将数组每个元素翻倍得到新数组。
- 性能:性能略低于 for 循环,同样存在函数调用开销,且要创建新数组。
- 对迭代器的支持:不依赖迭代器,仅用于数组,内部通过索引遍历数组。
6. filter 方法
- 使用场景:用于数组,创建一个新数组,其包含通过所提供函数实现的测试的所有元素。例如过滤出数组中的偶数。
- 性能:性能略低于 for 循环,有函数调用开销且要创建新数组。
- 对迭代器的支持:不依赖迭代器,仅用于数组,内部通过索引遍历数组。
7. reduce 方法
- 使用场景:用于数组,将数组元素通过回调函数累计处理为单个值。例如计算数组所有元素之和。
- 性能:性能略低于 for 循环,有函数调用开销。
- 对迭代器的支持:不依赖迭代器,仅用于数组,内部通过索引遍历数组。