对于 JavaScript 中循环之间的技术差异概述

在 JAVAScript 中使用循环时,需要理解两个关键点:可枚举的属性和可迭代的对象 。
可枚举的属性可枚举对象的一个定义特征是,当通过赋值操作符向对象分配属性时,我们将内部 enumerable 标志设置为true,这是默认值 。
当然,我们可以通过将其设置为false来更改此行为 。

要点:可枚举的属性都可以用for...in 遍历出来 。
举个例子看看:
// 会出现在 for ... in 循环中const gbols = {};gbols.platform = "LogRocket";Object.getOwnPropertyDescriptor(gbols, "platform");// {value: "LogRocket", writable: true, enumerable: true, configurable: true}for (const item in gbols) {   console.log(item)}// platform// 不会出现在 for ... in 循环中// 将 enumerable 设置为 falseObject.defineProperty(gbols, 'role', {value: 'Admin', writable: true, enumerable: false})for (const item in gbols) {  console.log(item)}// platform可迭代的对象如果一个对象定义了它的迭代行为,那么它就是可迭代的 。在这种情况下,将在for …of构造中循环的值将定义其迭代行为 。可迭代的内置类型包括Arrays、Strings、Sets和Maps。object 是不可迭代的,因为它没有指定@iterator method 。
在JavaScript中,所有可迭代都是可枚举的,但不是所有的可枚举都是可迭代的 。
for …in在数据中查找对象,而for ..of查找重复序列 。来个例子看看:
const authors = ['小智', '小王', '小明', '小红'];// 与 for in 循环一起使用fro (const author in authors) {  console.log(author)}// 打印: 0,1,2,3for (const author of authors) {  console.log(author)}// 打印:小智  小王  小明   小红使用此构造时,需要牢记的是,如果调用了 typeof 得到的类型是 object,则可以使用for…in循环 。
我们来看一下对authors变量的操作:
typeof authors// 打印的是 “object”,因此我们可以使用`for ..in`乍一看感觉有点奇怪,但必须注意,数组是一种特殊的对象,它以索引为键 。for ...in循环找到对象时,它将循环遍历每个键 。
for …in 遍历 authors 数组的方式可以用下面显式化的方式来理解:
const authors = {  0: 'Jade',  1: 'Dafe',  2: 'Gbols',  3: 'Daniel'}重要说明:如果可以追溯到对象(或从对象原型链继承它),因为for …in将以不特定的顺序遍历键 。
同时,如果实现 for.. of 构造的迭代器,则它将在每次迭代中循环遍历该值 。
ForEach 和 map 方法尽管可以使用forEach和map方法来实现相同的目标,但是它们的行为和性能方面存在差异 。
基础层面上,当函数被调用时,它们都接收一个回调函数作为参数 。
考虑下面的代码片段:
const scoresEach = [2,4 ,8, 16, 32];const scoresMap = [2,4 ,8, 16, 32];const square = (num) => num * num;我们逐一列出其操作上的一些差异 。
forEach返回undefined,而map返回一个新数组:
let newScores = []const resultWithEach = scoresEach.forEach((score) => {const newScore = square(score);newScores.push(newScore);});const resultWithMap = scoresMap.map(square);console.log(resultWithEach) // undefinedconsole.log(resultWithMap) // [4, 16, 64, 256, 1024]map是一个纯函数,而forEach则执行一些更改:
console.log(newScores) // [4, 16, 64, 256, 1024]在我看来,map倾向于函数式编程范例 。与forEach不同的是,我们并不总是需要执行一次更改来获得想要的结果,在forEach中,我们需要对newscore变量进行更改 。在每次运行时,当提供相同的输入时,map函数将产生相同的结果 。同时,forEach对应项将从最后一次更改的前一个值中获取数据 。
链式map可以使用链式操作,因为map返回的结果是一个数组 。因此,可以立即对结果调用任何其他数组方法 。换句话说,我们可以调用filter, reduce, some等等 。对于forEach,这是不可能的,因为返回的值是undefined 。


推荐阅读