前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >对于 JavaScript 中循环之间的技术差异概述

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

作者头像
前端小智@大迁世界
发布于 2022-06-15 07:20:15
发布于 2022-06-15 07:20:15
1.8K00
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:0
代码可运行

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

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

在 JavaScript 中使用循环时,需要理解两个关键点:可枚举的属性可迭代的对象

可枚举的属性

可枚举对象的一个定义特征是,当通过赋值操作符向对象分配属性时,我们将内部 enumerable 标志设置为true,这是默认值。

当然,我们可以通过将其设置为false来更改此行为。

要点:可枚举的属性都可以用for...in 遍历出来。

举个例子看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 会出现在 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查找重复序列。来个例子看看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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变量的操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typeof authors

// 打印的是 “object”,因此我们可以使用`for ..in`

乍一看感觉有点奇怪,但必须注意,数组是一种特殊的对象,它以索引为键。for ...in循环找到对象时,它将循环遍历每个键。

for …in 遍历 authors 数组的方式可以用下面显式化的方式来理解:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const authors = {
  0: 'Jade',
  1: 'Dafe',
  2: 'Gbols',
  3: 'Daniel'
}

重要说明:如果可以追溯到对象(或从对象原型链继承它),因为for …in将以不特定的顺序遍历键。

同时,如果实现 for.. of 构造的迭代器,则它将在每次迭代中循环遍历该值。

ForEach 和 map 方法

尽管可以使用forEachmap方法来实现相同的目标,但是它们的行为和性能方面存在差异。

基础层面上,当函数被调用时,它们都接收一个回调函数作为参数。

考虑下面的代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const scoresEach = [2,4 ,8, 16, 32];
const scoresMap = [2,4 ,8, 16, 32];
const square = (num) => num * num;

我们逐一列出其操作上的一些差异。

forEach返回undefined,而map返回一个新数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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则执行一些更改:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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... 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你不知道的javaScript笔记(3)
对象 对象可以通过两种形式定义: 声明形式和构造形式 声明形式语法: var myObj = {key:value} 构造形式语法: var myObj = new Object(); myObj.key = value; 类型: 语言类型有六种 : string number boolean null undefined object 内置对象: String Number Boolean Object Function Array Date RegExp Error var myObject = {  
用户1197315
2018/01/22
7280
ES6的语法
世间万物皆对象
2024/03/20
1470
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】
ES6版本邀请了新的舞伴加入:Symbol、Set和Map,这三位舞伴各具特色,各自承担着不同的角色,使得JavaScript这个舞变得更加精彩。
HelloWorldZ
2024/03/22
1660
JavaScript编码之路【ES6新特性之 Symbol 、Set 、Map、迭代器、生成器】
Javascript基础:js中属性描述符详解
该方法返回的是一个对象,该对象除了包含value为2的属性外,还包含了属性的三个特性。
IT工作者
2022/01/26
7680
JavaScript 中哪一种循环最快呢?
最让我感到惊讶的事情是,当我在本地计算机上进行测试之后,我不得不接受 for(倒序)是所有 for 循环中最快的这一事实。下面我会举个对一个包含超过一百万项元素的数组执行一次循环遍历的例子。
ConardLi
2021/04/07
1.1K0
JavaScript 中哪一种循环最快呢?
JavaScript对象
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
7830
【面试题解】Object.defineProperty 都能 \"define\" 什么?
可以看到,我分别打印了原始对象,修改属性后的对象,添加属性后的对象。如果第二个参数 prop 存在,则是修改属性操作,如果 prop 不存在,则是添加属性操作。
一尾流莺
2022/12/10
2990
【面试题解】Object.defineProperty 都能 \"define\" 什么?
分享 9 个实用的 JavaScript 技巧
https://javascript.plainenglish.io/9-javascript-tricks-that-make-your-code-fantastic-4cf3d7880229
前端达人
2023/08/31
2040
分享 9 个实用的 JavaScript 技巧
JavaScript 实战开发常用属性总结分享
Object.assign() 方法将多个对象的属性进行合并,返回一个新对象。其中第一个参数是目标对象,在合并时,源对象的属性将覆盖目标对象中同名属性的值。
程序员海军
2023/11/07
3710
深入浅出 JavaScript 中的For循环之详解
今天我想分享一个有关于循环筛选的知识点,也许是前端小白的你首先想到的是用for循环做筛选,但我这种小菜鸟想到的就是map(工作中很喜欢用= =),学过数据结构的小伙伴也肯定知道,线性表这些跟循环也息息相关,包括你出去面试的时候或许你遇到过这样的问题,map和forEach的区别?去重的几种方式?说实话,forEach我真的很少用,但不满足于现状的我,觉得应该多学习几种。我是前端挖坑妹,准备好了么?一起粗发~
苏南
2020/12/16
5110
深入浅出 JavaScript 中的For循环之详解
JavaScript String、Array、Object、Date 常用方法小结
  反正闲着也是闲着,稍微整理总结了一下 JavaScript 字符串、数组、对象、时间的常用方法,阿彪出品,必属精品/滑稽。
老猫-Leo
2023/12/11
2500
熬夜7天,我总结了JavaScript与ES的25个重要知识点!
说起JavaScript,大家都知道是一门脚本语言。那么ES是什么鬼呢?ES全称ECMAScript ,是JavaScript语言的国际标准。
达达前端
2020/09/17
1.8K0
熬夜7天,我总结了JavaScript与ES的25个重要知识点!
8个问题看你是否真的懂 JS
JavaScript 是一种有趣的语言,我们都喜欢它,因为它的性质。浏览器是JavaScript的主要运行的地方,两者在我们的服务中协同工作。JS有一些概念,人们往往会对它掉以轻心,有时可能会忽略不计。原型、闭包和事件循环等概念仍然是大多数JS开发人员绕道而行的晦涩领域之一。正如我们所知,无知是一件危险的事情,它可能会导致错误。
前端达人
2019/07/19
1.4K0
js中的四种for循环
最近刷题时遇到了几种不同for循环,因为没有深入了解导致做题时无法区分它们的用法,尤其是在以及在使用时的注意点。
用户7741497
2022/03/06
1.9K0
《你不知道的JavaScript》-- 对象(笔记)
在JavaScript中共有六种主要(语言)类型:string、number、boolean、null、undefined和object。
爱学习的程序媛
2022/04/07
6680
《你不知道的JavaScript》-- 对象(笔记)
JS常用的循环遍历你会几种?
? 这是第 100 篇不掺水的原创,想要了解更多,请戳上方蓝色字体:政采云前端团队 关注我们吧~ 本文首发于政采云前端团队博客:JS常用的循环遍历你会几种 https://www.zoo.team/
政采云前端团队
2021/06/15
2.2K0
JS常用的循环遍历你会几种?
ES6中的Iterator 和for of循环
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
青梅煮码
2023/02/18
8290
JS中的那些循环
1、 副作用: forEach返回undefined, 函数本身不会直接改变调用它的对象, 但是可以在callback里面对原数组进行修改
BLUSE
2022/11/20
2K0
JS遍历循环方法性能对比:for/while/for in/for of/map/foreach/every
这周codeReview例会,又遇到map与foreach到底谁问题。单独图方便,我会选择用map一个函数搞定一切。但是从语义的角度来讲,如果只是单纯遍历,还是推荐选择foreach。其实formap 与foreach,性能相差不大(个人测试数据在10000000,最后有测试案例)。如果用foreach 去实现map的效果,性能上就会比map差(因为需要操作另外一个数组).
周陆军
2021/08/24
3.8K0
javascript 中Object一些操作方法
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
chuchur
2022/10/25
6840
相关推荐
你不知道的javaScript笔记(3)
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验