乐趣区

关于javascript:对于-JavaScript-中循环之间的技术差异概述

作者:Gbolahan Olagunju
译者:前端小智
起源:blog

有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

在 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 设置为 false
Object.defineProperty(gbols, 'role', {value: 'Admin', writable: true, enumerable: false})

for (const item in gbols) {console.log(item)
}
// platform

可迭代的对象

如果一个对象定义了它的迭代行为,那么它就是可迭代的。在这种状况下,将在 for …of 结构中循环的值将定义其迭代行为。可迭代的内置类型包含 ArraysStringsSetsMapsobject 是不可迭代的,因为它没有指定@iterator method

在 Javascript 中,所有可迭代都是可枚举的,但不是所有的可枚举都是可迭代的。

for …in在数据中查找对象,而 for ..of 查找反复序列。来个例子看看:

const authors = ['小智', '小王', '小明', '小红'];

// 与 for in 循环一起应用
fro (const author in authors) {console.log(author)
}

// 打印: 0,1,2,3

for (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 办法

只管能够应用 forEachmap办法来实现雷同的指标,然而它们的行为和性能方面存在差别。

根底层面上,当函数被调用时,它们都接管一个回调函数作为参数。

思考上面的代码片段:

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) // undefined
console.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

性能

map 办法的性能往往优于 forEach 办法。

查看用 mapforEach实现的等效代码块的性能。均匀而言,map函数的执行速度至多要快50%

留神:此基准测试取决于你应用的计算机以及浏览器的实现。

总结

在下面探讨的所有循环构造中,为咱们提供最多管制的是 for..of 的循环。咱们能够将它与关键字 returncontinuebreak一起应用。这意味着咱们能够指定咱们心愿对数组中的每个元素产生什么,以及咱们是想早点来到还是跳过。


原文:https://medium.com/better-pro…

代码部署后可能存在的 BUG 没法实时晓得,预先为了解决这些 BUG,花了大量的工夫进行 log 调试,这边顺便给大家举荐一个好用的 BUG 监控工具 Fundebug。


交换

有幻想,有干货,微信搜寻 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。

本文 GitHub https://github.com/qq44924588… 已收录,有一线大厂面试残缺考点、材料以及我的系列文章。

退出移动版