当前位置:网站首页>for...in 和 for...of 的区别
for...in 和 for...of 的区别
2022-07-30 21:45:00 【鱼子酱酱酱】
for…in 和 for…of 的区别
key 和 value
for…in 遍历 key , for…of 遍历 value
const arr = [10, 20, 30]
for (let n of arr) {
console.log(n)
}
const str = 'abc'
for (let s of str) {
console.log(s)
}
function fn() {
for (let argument of arguments) {
console.log(argument) // for...of 可以获取 value ,而 for...in 获取 key
}
}
fn(10, 20, 30)
const pList = document.querySelectorAll('p')
for (let p of pList) {
console.log(p) // for...of 可以获取 value ,而 for...in 获取 key
}
遍历对象
for…in 可以遍历对象,for…of 不可以
遍历 Map/Set
for…of 可以遍历 Map/Set ,for…in 不可以
const set1 = new Set([10, 20, 30])
for (let n of set1) {
console.log(n)
}
let map1 = new Map([
['x', 10], ['y', 20], ['z', 3]
])
for (let n of map1) {
console.log(n)
}
遍历 generator
for…of 可遍历 generator ,for…in 不可以
function* foo(){
yield 10
yield 20
yield 30
}
for (let o of foo()) {
console.log(o)
}
对象的可枚举属性
for…in 遍历一个对象的可枚举属性。
使用 Object.getOwnPropertyDescriptors(obj)
可以获取对象的所有属性描述,看 enumerable: true
来判断该属性是否可枚举。
对象,数组,字符传
可迭代对象
for…of 遍历一个可迭代对象。
其实就是迭代器模式,通过一个 next
方法返回下一个元素。
该对象要实现一个 [Symbol.iterator]
方法,其中返回一个 next
函数,用于返回下一个 value(不是 key)。
可以执行 arr[Symbol.iterator]()
看一下。
JS 中内置迭代器的类型有 String
Array
arguments
NodeList
Map
Set
generator
等。
答案
- for…in 遍历一个对象的可枚举属性,如对象、数组、字符串。针对属性,所以获得 key
- for…of 遍历一个可迭代对象,如数组、字符串、Map/Set 。针对一个迭代对象,所以获得 value
题外话:for await…of
用于遍历异步请求的可迭代对象。
// 像定义一个创建 promise 的函数
function createTimeoutPromise(val) {
return new Promise(resolve => {
setTimeout(() => {
resolve(val)
}, 1000)
})
}
如果你明确知道有几个 promise 对象,那直接处理即可
(async function () {
const p1 = createTimeoutPromise(10)
const p2 = createTimeoutPromise(20)
const v1 = await p1
console.log(v1)
const v2 = await p2
console.log(v2)
})()
如果你有一个对象,里面有 N 个 promise 对象,你可以这样处理
(async function () {
const list = [
createTimeoutPromise(10),
createTimeoutPromise(20)
]
// 第一,使用 Promise.all 执行
Promise.all(list).then(res => console.log(res))
// 第二,使用 for await ... of 遍历执行
for await (let p of list) {
console.log(p)
}
// 注意,如果用 for...of 只能遍历出各个 promise 对象,而不能触发 await 执行
})()
【注意】如果你想顺序执行,只能延迟创建 promise 对象,而不能及早创建。
即,你创建了 promise 对象,它就立刻开始执行逻辑。
(async function () {
const v1 = await createTimeoutPromise(10)
console.log(v1)
const v2 = await createTimeoutPromise(20)
console.log(v2)
for (let n of [100, 200]) {
const v = await createTimeoutPromise(n)
console.log('v', v)
}
})()
边栏推荐
- MYSQL JDBC图书管理系统
- cnpm的安装与使用
- Solve the problem of centos8 MySQL password ERROR 1820 (HY000) You must reset your password using the ALTER USER
- openim支持十万超级大群
- Solve npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead
- 使用LVS和Keepalived搭建高可用负载均衡服务器集群
- MYSQL JDBC Book Management System
- 【网络安全专栏目录】--企鹅专栏导航
- The structure of knowledge in the corners of the C language
- 数据指标口径不统一、重复开发?亿信ABI指标管理平台帮你解决
猜你喜欢
基于ABP实现DDD--领域服务、应用服务和DTO实践
cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
cookie和session区别
你需要知道的ES6—ES13开发技巧
鳄梨价格数据集(Avocado Prices)
cnpm installation steps
手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
LeetCode·每日一题·952.按公因数计算最大组件大小·并查集
ClickHouse删除数据之delete问题详解
Detailed explanation of the delete problem of ClickHouse delete data
随机推荐
HCIP第十六天
cookie和session区别
DistSQL 深度解析:打造动态化的分布式数据库
MySql 5.7.38 download and installation tutorial, and realize the operation of MySql in Navicat
深入浅出富文本编辑器
nVisual网络可视化管理平台功能和价值点
【菜鸡含泪总结】如何用pip、anaconda安装库
【信息安全技术】RSA算法的研究及不同优化策略的比较
MySQL 8.0.29 set and modify the default password
CISP-PTE Zhenti Demonstration
不用bs4的原因居然是名字太长?爬取彩票开奖信息
mysql deadlock
(7/29)基础板子最小生成树prim+kruskal
MySQL 用户授权
The reason for not using bs4 is that the name is too long?Crawl lottery lottery information
Google Earth Engine ——我们如何筛选一个列表中的排序以时间为例
navicat新建数据库
The structure of knowledge in the corners of the C language
Jetson AGX Orin 平台关于c240000 I2C总线和GMSL ses地址冲突问题
Solve npm warn config global `--global`, `--local` are deprecated. use `--location=global` instead