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 的区别相关推荐

  1. RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别

    1. 基本概念 PRC 远程过程调用 Remote Procedure Call,其就是一个节点请求另外一个节点提供的服务.当两个物理分离的子系统需要建立逻辑上的关联时,RPC 是牵线搭桥的常见技术手 ...

  2. C++ 笔记(28)— C++ 中 NULL和 nullptr 的区别

    最近看公司代码的时候发现在判断指针是否为空的时候,有的时候用的是 NULL, 有的时候用的是 nullptr 感觉很奇怪,好奇心驱使我查了下两者的区别,发现还是有很多细节需要学习的. 1. NULL ...

  3. gcc 和 g++ 的联系和区别,使用 gcc 编译 c++

    GCC 编译器已经为我们提供了调用它的接口,对于 C 语言或者 C++ 程序,可以通过执行 gcc 或者 g++ 指令来调用 GCC 编译器. 实际使用中我们更习惯使用 gcc 指令编译 C 语言程序 ...

  4. Python2 与 Python3 区别

    Python2.x 与 Python3.x 区别 1. print 函数 Python2 中 print 是语句(statement),Python3 中 print 则变成了函数.在 Python3 ...

  5. Docker 入门系列(1)- 初识容器,镜像、容器、仓库的区别

    Docker 简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发 ...

  6. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  7. python二进制打开(rb)和文本格式打开(r)什么区别?

    使用 open() 函数以文本格式打开文件和以二进制格式打开文件,唯一的区别是对文件中换行符的处理不同. 在 Windows 系统中,文件中用 "\r\n" 作为行末标识符(即换行 ...

  8. python中__dict__与dir()区别

    前言 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的管理方案. __dict__与dir()的区别: dir()是一个函数,返回的是list: _ ...

  9. java和C#面向对象的区别

    问题:C#中的构造函数和java的构造函数一样吗? 答: .net的项目中,写实体Entity属性时,经常会为每一个属性写一对get和set方法,在用到这个实体或是一个类时,通过new实例化一个对象, ...

  10. 判别模型和生成模型的区别

    20210703 https://www.zhihu.com/question/20446337 机器学习"判定模型"和"生成模型"有什么区别? 重点 http ...

最新文章

  1. LL(1)预测分析表的构造
  2. GitHub重大更新:在线开发上线,是时候卸载IDE了
  3. 常见采集脑电信号的四种技术
  4. python 代码-20个Python代码段,你需要立刻学会,好用到哭!
  5. Python 自动化-pywinauto遍历展示程序的所有菜单项,菜单栏menu_select()操作方法的使用
  6. python pandas爬取网页成绩表格,计算各个类别学分
  7. 设置log缓存_带你搞明白什么是缓存穿透、缓存击穿、缓存雪崩
  8. 石子归并 51Nod - 1021
  9. Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
  10. CCIE理论-第八篇-SD-WAN(三)+DAI(动态ARP检测)
  11. Visual Studio.net 2010 Windows Service 开发,安装与调试
  12. CV算法助理 | 华为外包招聘
  13. UI设计入门:解析设计标注规范和图标规范
  14. while循环 dowhile循环 for循环(C++)
  15. vue学习笔记-9-tab选项卡小案例
  16. 11年的macbook还能用吗_致我2011年买的macbook pro 15寸一封信
  17. android 卡片消息,安卓QNotified 支持xml卡片QQ消息 - 陌路人博客
  18. 商业汇票的背书、贴现与质押
  19. 联想小新Pad Pro 2021平板(TB-J716F) 解BL锁ROOT过程命令记录
  20. PPOCRv3模型转pytorch

热门文章

  1. golang简短变量声明
  2. 在shell中变量的赋值有五种方法
  3. STM32F1与STM32F0在GPIO_TypeDef 寄存器方面的不同
  4. jvm:虚方法与非虚方法
  5. Windows上的原生Linux容器(盆盆的Kubecon课程分享)
  6. 邮件服务器软件EwoMail 1.05 发布
  7. springboot集成swagger2构建RESTful API文档
  8. 台积电获苹果A10大量订单 三季度销售额将增长20%
  9. UEditor在线编辑器使用记录
  10. Mybatis的几点小结