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

更新日期: 2022-01-11阅读: 1.3k标签: 循环

在 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构造中循环的值将定义其迭代行为。可迭代的内置类型包括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,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 方法

尽管可以使用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) // 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方法。

检查用map和forEach实现的等效代码块的性能。平均而言,map函数的执行速度至少要快50%。

注意:此基准测试取决于你使用的计算机以及浏览器的实现。

总结

在上面讨论的所有循环结构中,为我们提供最多控制的是for..of的循环。我们可以将它与关键字return、continue和break一起使用。这意味着我们可以指定我们希望对数组中的每个元素发生什么,以及我们是想早点离开还是跳过。

原文:https://medium.com/better-programming/22-miraculous-tools-for-react-developers-in-2019-7d72054e2306


链接: https://fly63.com/article/detial/11020

跳出 forEach

使用for...in遍历对象时,会遍历原型链上的可枚举属性,这可能会导致一些意想不到的问题。所以你一定收到过这样的建议,使用数组的forEach来代替for...in循环。本文给大家总结了5种在forEach中跳出循环的变通之法

JavaScript循环下的async/await

在进行业务开发的过程中,使用了数组的高级函数map,同时使用了ES6语法async/await,发现在map循环下任务是异步执行的,并不符合预期。Array的循环方法map、forEach、filter、reduce、some、every等是并行迭代,可以理解为async/await的效果是无效的

如何中断forEach循环

在使用for循环的时候可以使用break 或者return语句来结束for循环(return直接结束函数),但是如果使用forEach循环如何跳出循环呢?首先尝试一使用return语句----木有效果

用于JavaScript中的循环和同时循环

如果您需要重复大量的代码数百次,这会变得非常笨拙。而且,它也不是很有用。例如,如果希望它重复X次呢?这就是循环的用武之地。次数通常由变量决定,但也可以由实际数字决定。

Js中循环执行

循环:就是一遍又一遍执行相同或者相似的代码,循环的两个要素:循环体:重复执行的代码;循环条件:控制循环的次数

为啥要放弃for循环?

创建一个新的数组,新的数组中的元素是通过检查指定数组中符合条件的元素;注意:1. filter()不会对空数组进行检测;2. filter()不会改变源是数组;

解决使用Vue-Router出现无限循环问题

我在项目里面用到了的是全局守卫,beforeEach,方便管理 不过遇到了一个问题,就是在beforeEach()中设置好判断条件后出现了无限循环的问题 当时的代码如下:

Node.js事件循环

对于本文中一些知识点任然有些模糊,懵懵懂懂,一直都在学习中,通过学习事件循环也看了一些文献,在其中看到了这一句话:除了你的代码,一切都是同步的,我觉得很有道理,对于理解事件循环很有帮助。

关于for循环中使用setTimeout的四种解决方案

我们先来简单了解一下setTimeout延时器的运行机制。setTimeout会先将回调函数放到等待队列中,等待区域内其他主程序执行完毕后,按时间顺序先进先出执行回调函数。本质上是作用域的问题

Js循环的几种方法

for 常用于循环数组 ,for in 常用来循环对象,不建议循环数组,因为i是字符串 可能会有隐患问题,for in 循环会找到 prototype 上去,所以最好在循环体内加一个判断

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!