for in和for of对比

不同点:
时间点不同:for in 在js出现之初就有,for of出现在ES6之后
遍历的内容不同:for in用于遍历对象的可枚举属性(包括原型链上的可枚举属性),for of用于遍历可迭代对象的值

看个例子

// for in
const arr = ['a','b','c','d']
for(const index in arr) {console.log(index) 
}
// 打印结果:'0' '1' '2' '3',可以发现打印的是数组的下标,数组是特殊的对象,下标是数组对象身上的可枚举属性,打印的就是这个可枚举属性// for of
for(const item of arr) {console.log(item)
}
// 打印结果:'a' 'b' 'c' 'd',for of打印的就是数组里的每一项元素的值

可枚举属性
通过Object.getOwnPropertyDescriptor(obj, property),可以拿到属性描述符

// 还是以数组为例,获取数组的属性'0'
console.log(Object.getOwnPropertyDescriptor(['a'],'0'))
/*** {*   configurable: true,*   enumerable: true,*   value: "a",*   writable: true* }*/
/* 可以看到返回了一个对象,这个对象就是属性描述符,属性描述符的属性一般被称为特性,可以看到,第二个特性enumerable就代表属性是否可枚举可枚举的属性就可以通过for in与Object.keys遍历,数组身上有一个length属性,但上面我们用for in 循环的时候并没有打印length,说明length属性是一个不可枚举属性,我们来看一下length属性的属性描述符:
*/
console.log(Object.getOwnPropertyDescriptor(['a'],'length'))
/*** {*   configurable: false,*   enumerable: false,*   value: 1,*   writable: true* }*/
// 可以看到数组身上的length属性的属性描述符里,enumerable为false,它是一个不可枚举属性,属性描述符还有其他的特性,此处就不展开描述了,感兴趣可以自行查阅

可迭代对象
实现了[Symbol.iterator]方法的对象,就被称为可迭代对象
对象进行for…of循环时,会调用Symbol.iterator方法,返回该对象的默认遍历器
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)
链接: link

const obj = {[Symbol.iterator] : function () {return {next: function () {return {value: 1,done: true};}};}
};

上面的代码中,对象obj是可遍历的(iterable),因为具有Symbol.iterator属性。执行这个属性,会返回一个遍历器对象。该对象的根本特征就是具有next方法。每次调用next方法,都会返回一个代表当前成员的信息对象,具有value和done两个属性
所以,对象只要实现了[Symbol.iterator]方法,就是可迭代的,即可使用for…of遍历
原生具备 Iterator 接口的数据结构如下
Array
Map
Set
String
TypedArray
函数的 arguments 对象
NodeList 对象

案例:数组的Symbol.iterator属性

let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }

实现[Symbol.iterator]方法好麻烦,怎么这么复杂,于是有Generator 函数
Generator函数可以直接返回一个遍历器对象
由于 Generator 函数就是遍历器生成函数,因此可以把 Generator 赋值给对象的Symbol.iterator属性,从而使得该对象具有 Iterator 接口

var myIterable = {};
myIterable[Symbol.iterator] = function* () {yield 1;yield 2;yield 3;
};[...myIterable] // [1, 2, 3]
for(const item of myIterable){console.log(item)} //1,2,3

上面代码中,Generator 函数赋值给Symbol.iterator属性,从而使得myIterable对象具有了 Iterator 接口,可以被…运算符和for…in遍历了

async await,async await就是生成器函数的语法糖,配合promise,用生成器函数加yield也可以实现async await同样的效果

参考:链接: link
链接: link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/43751.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux--线程的控制

目录 0.前言 1.pthread库 2.关于控制线程的接口 2.1.创建线程(pthread_create) 2.2.线程等待(pthread_join) 代码示例1: ​编辑 ***一些问题*** 2. 3.创建多线程 3.线程的终止 (pthread_exit /…

给数组/对象添加一个(key-value)对象

需要将一个value值前面加上key值,放进数组/对象中 this.$set(res.data[0],type,1) this.$set( target, key, value ) target:要更改的数据源(可以是对象或者数组) key:要更改的具体数据 value :重新赋的值。 结果:…

文华财经盘立方多空变色波段趋势线指标公式源码

文华财经盘立方多空变色波段趋势线指标公式源码&#xff1a; N1:20; N2:ROUND(N1/2,1); N3:ROUND(SQRT(N1),1); N4:2*EMA2(C,N2)-EMA2(C,N1); 尊重市场:EMA2(N4,N3),COLORRED,LINETHICK2; 尊重市场1:IF(尊重市场<REF(尊重市场,1), 尊重市场,NULL),COLORGREEN,LINETHIC…

C++之List模拟实现

目录 list的逻辑结构 构造函数 拷贝构造函数 赋值运算符重载 返回迭代器的初始位置 返回迭代器的最终位置 元素的插入 头插 尾插 删除元素 头删 尾删 清空整个链表 析构函数 正向迭代器 反向迭代器 整体代码 上期我们学写了list的基本操作&#xff0c;本期我…

苏东坡传-读书笔记十一

苏东坡对写作与风格所表示的意见最为清楚。他说做文章“大略如行云流水&#xff0c;初无定质&#xff0c;但常行于所当行&#xff0c;常止于所不可不止。文理自然&#xff0c;姿态横生。孔子曰&#xff1a;‘言之不文&#xff0c;行而不远。’又曰&#xff1a;‘辞达而已矣。’…

【cocos creator】2.4.x实现简单3d功能,点击选中,旋转,材质修改,透明材质

demo下载:(待审核) https://download.csdn.net/download/K86338236/89527924 const {ccclass, property } = cc._decorator;const enum box_color {NORMAL = 0,DASHED_LINE = 1,//虚线TRANSLUCENT = 2,//半透明 }@ccclass export default class main extends cc.Component {…

STC32G/F/8H通用无刷电机驱动板

STC32G/F/8H通用无刷电机驱动板 &#x1f4cc;相关篇《低成本STC32G8K64驱动控制BLDC开源入门学习方案》 ✨该驱动板是在上一版的基础上改版而来。这里的STC32G/F/8H所指的是封装型号为-LQFP48的STC32G8K64、STC32G12K128、STC32F12K54、STC8H8K64U。是一款兼容有感和无感设计的…

数据结构--树和二叉树的一些知识点总结

树是n个结点的有限集&#xff0c;当n0时&#xff0c;称为空树。树是一种递归的数据结构&#xff0c;树作为一种逻辑结构同时也是一种分层的结构结点的深度是从根开始自顶向下累加&#xff1b;结点的高度是从叶结点自底向上累加由于树中的分支是有向的&#xff0c;即从双亲指向孩…

【Java算法】二分查找 下

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 一.山脉数组的峰顶索引 题目链接&#xff1a;852.山脉数组的峰顶 ​ 算法原理 这段代码实现了一个查找山峰数组中峰值索引的算法。山峰数组是一个先递增后递减的数组&…

玩具营销是如何拿捏成年人钱包?

好像现在的成年人逐渐热衷于偏向年轻化&#xff0c;问问题会好奇“尊嘟假嘟”&#xff0c;饭量上的“儿童套餐”&#xff0c;娃娃机前排长队......而最突出的莫过于各类各式的玩具不断收割当代年轻人&#xff0c;除去常给大朋友们小朋友们送去玩具福利的“麦、肯”双门&#xf…

激光干涉仪可以完成哪些测量:全面应用解析

在高端制造领域&#xff0c;精度是衡量产品质量的关键指标之一。激光干涉仪作为一项高精度测量技术&#xff0c;其应用广泛&#xff0c;对于提升产品制造精度具有重要意义。 线性测量&#xff1a;精确定位的基础 激光干涉仪采用迈克尔逊干涉原理&#xff0c;实现线性测量。该…

AlphaGo 的传奇故事

文章目录 一、说明二、AlphaGo 传奇&#xff08;一&#xff09;&#xff1a;游戏规则三、AlphaGo 传奇(二)&#xff1a;它是如何运作的&#xff1f;四、AlphaGo 传奇&#xff08;三&#xff09;&#xff1a;史诗般的战斗和人工智能的未来 一、说明 1997 年&#xff0c;IBM 的“…

卷积神经网络之ResNet50迁移学习

数据准备 下载狗与狼分类数据集&#xff0c;数据来自ImageNet&#xff0c;每个分类有大约120张训练图像与30张验证图像。使用download接口下载数据集&#xff0c;并自动解压到当前目录。 全是小狗的图片 另一边全是狼的图片 加载数据集 狼狗数据集提取自ImageNet分类数据集&a…

2-3个月的幼猫能吃主食冻干吗?第一次吃哪款主食冻干比较好

2-3个月的幼猫能吃冻干吗&#xff1f;一般来说&#xff0c;幼猫在2-3个月左右的离乳期就可以吃冻干了。需要注意的&#xff0c;一个是要认准主食冻干&#xff0c;零食冻干会让猫猫从小就挑食&#xff0c;以后就更不好纠正了。而且离乳期的猫猫没有了母乳的保护&#xff0c;免疫…

Open3D 点对面的ICP算法配准(精配准)

目录 一、概述 1.1核心思想 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2配准后点云 3.3计算数据 一、概述 基于点对面的ICP&#xff08;Iterative Closest Point&#xff09;配准算法是ICP的一种变体&#xff0c;它通过最小化源…

【Ty CLI】一个开箱即用的前端脚手架

目录 资源链接基础命令模板创建命令帮助选择模板开始创建开发模板 开发背景npm 发布流程问题记录模板创建超时 更新日志 资源链接 文档&#xff1a;https://ty.cli.vrteam.top/ 源码&#xff1a;https://github.com/bosombaby/ty-cli 基础命令 1. npm 全局安装 npm i ty-cli…

Zabbix Sia Zabbix 逻辑漏洞(CVE-2022-23134)

前言 CVE-2022-23134是一个中等严重度的漏洞&#xff0c;影响Zabbix Web前端。这个漏洞允许未经身份验证的用户访问setup.php文件的某些步骤&#xff0c;这些步骤通常只对超级管理员开放。利用这个漏洞&#xff0c;攻击者可以通过跳过某些步骤来重新配置Zabbix前端&#xff0c…

gazebo仿真环境中加入livox mid360

https://github.com/Livox-SDK/livox_laser_simulation 功能包适用于ubuntu18.04 gazebo9的可以直接编译运行。在ubutun20.04 的系统下gazebo是11版本,需要做一些修改 CMakeLists.txt文件中的 add_compile_options(-std=c++11) 改为 add_compile_options(-std=c++17)fatal er…

二一、搭建自已的语言大模型

1. 配置langchain环境 使用conda创建一个虚拟环境,基于 Python3.10,并在虚拟环境内安装项目的依赖。注意,大模型对gpu有一定的要求,否则速度会奇慢无比。 conda create -n langchain python=3.10 conda env list conda activate langchain # 拉取仓库 $ git clone ht…

Redis-Jedis连接池\RedisTemplate\StringRedisTemplate

Redis-Jedis连接池\RedisTemplate\StringRedisTemplate 1. Jedis连接池1.1 通过工具类1.1.1 连接池&#xff1a;JedisConnectionFactory&#xff1a;1.1.2 test&#xff1a;&#xff08;代码其实只有连接池那里改变了&#xff09; 2. SpringDataRedis&#xff08;lettuce&#…