for-in 和 for-of 的区别
1. for-in循环
for-in循环主要用于遍历对象,for()中的格式:for(keys in zhangsan){}
keys表示obj对象的每一个键值对的键!!所有循环中,需要使用obj[keys]来取到每一个值!!!for-in 循环,遍历时不仅能读取对象自身上面的成员属性,也能延续原型链遍历出对象的原型属性所以,可以使用hasOwnProperty判断一个属性是不是对象自身上的属性obj.hasOwnProperty(keys)==true 表示这个属性是对象的成员属性,而不是原先属性。
//声明一个Peson类
function Person(){this.name = "张三";this.age = 14;this.func1 = function(){}
}
//实例化这个类
var zhangsan = new Person();
//使用for-in遍历这个对象
for(keys in zhangsan){console.log(zhangsan[keys])
}
2. for-of循环
ES6 借鉴 C++、Java、C# 和 Python 语言,引入了for…of循环,作为遍历所有数据结构的统一的方法。
一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for…of循环遍历它的成员。也就是说,for…of循环内部调用的是数据结构的Symbol.iterator方法。
for…of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串
1. 数组
var arr = ['a', 'b', 'c', 'd'];for (let a in arr) {console.log(a); // 0 1 2 3}for (let a of arr) {console.log(a); // a b c d}
上面代码表明,for…in循环读取键名,for…of循环读取键值。如果要通过for…of循环,获取数组的索引,可以借助数组实例的entries方法和keys方法
2.Set 和 Map 结构
var engines = new Set(["Gecko", "Trident", "Webkit", "Webkit"]);
for (var e of engines) {console.log(e);
}
// Gecko Trident Webkitvar es6 = new Map();
es6.set("edition", 6);
es6.set("committee", "TC39");
es6.set("standard", "ECMA-262");
for (var [name, value] of es6) {console.log(name + ": " + value);
}
// edition: 6
// committee: TC39
// standard: ECMA-262
上面代码演示了如何遍历 Set 结构和 Map 结构。值得注意的地方有两个,首先,遍历的顺序是按照各个成员被添加进数据结构的顺序。其次,Set 结构遍历时,返回的是一个值,而 Map 结构遍历时,返回的是一个数组,该数组的两个成员分别为当前 Map 成员的键名和键值。
3.类似数组的对象
类似数组的对象包括好几类。下面是for…of循环用于字符串、DOM NodeList 对象、arguments对象的例子。
// 字符串var str = "hello";for (let s of str) {console.log(s); // h e l l o}
// DOM NodeList对象let paras = document.querySelectorAll("p");for (let p of paras) {p.classList.add("test");}
// arguments对象function printArgs() {for (let x of arguments) {console.log(x);}}
printArgs('a', 'b');// 'a' 'b'
与其他遍历语法的比较
for…in循环有几个缺点
①数组的键名是数字,但是for…in循环是以字符串作为键名“0”、“1”、“2”等等。
②for…in循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。
③某些情况下,for…in循环会以任意顺序遍历键名。
for…in循环主要是为遍历对象而设计的,不适用于遍历数组。for…of循环
有着同for…in一样的简洁语法,但是没有for…in那些缺点。
不同于forEach方法,它可以与break、continue和return配合使用。
提供了遍历所有数据结构的统一操作接口
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 ...
最新文章
- 软件项目管理面面观之“玩的就是心跳”
- 利用SSH端口转发功能实现X转发
- Java:自定义异常处理类
- 多云和混合云_多云互操作性!=云服务聚合
- (48)FPGA面试技能提升篇(数字采样、射频存储、频谱搬移)
- 从零开始学Go之并发(四):互斥
- JavaSE基础——构造方法 对象的创建步骤 static关键字
- MaxtoCode 1.10 普及版 开发已经接近尾声
- 史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!
- Unity3D 虚拟现实开发(一)
- HTML基础-综合案例1-学生信息表
- arcgis做dijkstra_GIS最短路径分析中Dijkstra算法的优化
- QQ群关键字提醒设置
- 五大车载操作(VOS)系统优劣对比,车载系统架构分析-QNX系统性能分析
- 数字三角形 计算最大路径 动态规划
- 【实战项目】基于BP神经网络的温度预测(附源码)
- 金立android怎么升级到7.o,金立手机怎么刷机?只需七步轻松刷机
- 单片机寻迹小车ppt_基于单片机循迹小车的设计.doc
- 单件模式之可乐瓶实现
- SpringBoot 错误页面使用、自定义错误页、自定义异常、自定义异常解析器