for in 和 for of 的区别
1、for...in 循环:只能获得对象的键名,不能获得键值
for...of 循环:允许遍历获得键值
var arr = ['red', 'green', 'blue']for(let item in arr) {console.log('for in item', item)}/*for in item 0for in item 1for in item 2*/for(let item of arr) {console.log('for of item', item)}/*for of item redfor of item greenfor of item blue*/
2、对于普通对象,没有部署原生的 iterator 接口,直接使用 for...of 会报错
var obj = {'name': 'Jim Green','age': 12}for(let key of obj) {console.log('for of obj', key)}// Uncaught TypeError: obj is not iterable
可以使用 for...in 循环遍历键名
for(let key in obj) {console.log('for in key', key)}/*for in key namefor in key age*/
也可以使用 Object.keys(obj) 方法将对象的键名生成一个数组,然后遍历这个数组
for(let key of Object.keys(obj)) {console.log('key', key)}/*key namekey age*/
3、for...in 循环不仅遍历数字键名,还会遍历手动添加的其它键,甚至包括原型链上的键。for...of 则不会这样
let arr = [1, 2, 3]arr.set = 'world' // 手动添加的键Array.prototype.name = 'hello' // 原型链上的键for(let item in arr) {console.log('item', item)}/*item 0item 1item 2item setitem name*/for(let value of arr) {console.log('value', value)}/*value 1value 2value 3*/
4、forEach 循环无法中途跳出,break 命令或 return 命令都不能奏效
let arr = [1, 2, 3, 5, 9]arr.forEach(item => {if(item % 2 === 0) {return}console.log('item', item)})/*item 1item 3item 5item 9*/
for...of 循环可以与break、continue 和 return 配合使用,跳出循环
for(let item of arr) {if(item % 2 === 0) {break}console.log('item', item)}// item 1
5、无论是 for...in 还是 for...of 都不能遍历出 Symbol 类型的值,遍历 Symbol 类型的值需要用 Object.getOwnPropertySymbols() 方法
{let a = Symbol('a')let b = Symbol('b')let obj = {[a]: 'hello',[b]: 'world',c: 'es6',d: 'dom'}for(let key in obj) {console.info(key + ' --> ' + obj[key])}/*c --> es6d --> dom*/let objSymbols = Object.getOwnPropertySymbols(obj)console.info(objSymbols) // [Symbol(a), Symbol(b)]objSymbols.forEach(item => {console.info(item.toString() + ' --> ' + obj[item])})/*Symbol(a) --> helloSymbol(b) --> world*/// Reflect.ownKeys 方法可以返回所有类型的键名,包括常规键名和Symbol键名let keyArray = Reflect.ownKeys(obj)console.log(keyArray) // ["c", "d", Symbol(a), Symbol(b)] }
总之,for...in 循环主要是为了遍历对象而生,不适用于遍历数组
for...of 循环可以用来遍历数组、类数组对象,字符串、Set、Map 以及 Generator 对象
转载于:https://www.cnblogs.com/rogerwu/p/10738776.html
for in 和 for of 的区别相关推荐
- RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...
- C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别
最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...
- gcc 和 g++ 的联系和区别,使用 gcc 编译 c++
GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...
- Python2 与 Python3 区别
Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...
- Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别
Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...
- HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)
TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...
- python二进制打开(rb)和文本格式打开(r)什么区别?
使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...
- python中__dict__与dir()区别
前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...
- java和C#面向对象的区别
问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...
- 判别模型和生成模型的区别
20210703 https://www.zhihu.com/question/20446337 机器学习"判定模型"和"生成模型"有什么区别? 重点 http ...
最新文章
- LL(1)预测分析表的构造
- GitHub重大更新:在线开发上线,是时候卸载IDE了
- 常见采集脑电信号的四种技术
- python 代码-20个Python代码段,你需要立刻学会,好用到哭!
- Python 自动化-pywinauto遍历展示程序的所有菜单项,菜单栏menu_select()操作方法的使用
- python pandas爬取网页成绩表格,计算各个类别学分
- 设置log缓存_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩
- 石子归并 51Nod - 1021
- Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
- CCIE理论-第八篇-SD-WAN(三)+DAI(动态ARP检测)
- Visual Studio.net 2010 Windows Service 开发,安装与调试
- CV算法助理 | 华为外包招聘
- UI设计入门:解析设计标注规范和图标规范
- while循环 dowhile循环 for循环(C++)
- vue学习笔记-9-tab选项卡小案例
- 11年的macbook还能用吗_致我2011年买的macbook pro 15寸一封信
- android 卡片消息,安卓QNotified 支持xml卡片QQ消息 - 陌路人博客
- 商业汇票的背书、贴现与质押
- 联想小新Pad Pro 2021平板(TB-J716F) 解BL锁ROOT过程命令记录
- PPOCRv3模型转pytorch