详解JS中遍历语法的比较


Posted in Javascript onApril 07, 2017

for循环

JavaScript 提供多种遍历语法。最原始的写法就是for循环。

let arr = [1,2,3,4,5];

for (var index = 0; index < arr.length; index++) {
 console.log(myArray[index]); // 1 2 3 4 5
}

缺点:这种写法比较麻烦

forEach

数组提供内置的forEach方法

let arr = [1,2,3,4,5];

arr.forEach((element,index) => {
  console.log(element); // 1 2 3 4 5
});

缺点:这种写法的问题在于,无法中途跳出forEach循环,break命令或return命令都不能奏效。

 for...in

for…in 用于遍历对象所有的可枚举属性,功能类似于Object.keys()。 

let obj = {
  name: 'cloud',
  phone: '157xxxx2065'
}
 
for (let prop in obj) {
  console.log(prop); // name phone
}

可能有朋友会问,不可枚举的对象有哪些呢? 比如constructor,数组的length就属于不可枚举属性。

let arr = [10, 20, 30, 40, 50];
 
for (let prop in arr) {
  console.log(prop); // '0' '1' '2' '3' '4'
}

缺点:

  1. 数组的键名是数字,但是for...in循环是以字符串作为键名“0”、“1”、“2”等等。
  2. for...in循环主要是为遍历对象而设计的,不适用于遍历数组

 for...of

for…of是ES6新增的遍历方式,它提供了统一的遍历机制。所有实现了[Symbol.iterator]接口的对象都可以被遍历。for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串

优点:

  1. 有着同for...in一样的简洁语法,但是没有for...in那些缺点
  2. 不同用于forEach方法,它可以与breakcontinuereturn配合使用
  3. 提供了遍历所有数据结构的统一操作接口

下面是一个使用break语句,跳出for...of循环的例子。

for (var n of fibonacci) {
 if (n > 1000)
  break;
 console.log(n);
}

上面的例子,会输出斐波纳契数列小于等于1000的项。如果当前项大于1000,就会使用break语句跳出for...of循环。

 for...of获取索引

  1. entries() 返回一个遍历器对象,用来遍历[键名, 键值]组成的数组。对于数组,键名就是索引值;对于 Set,键名与键值相同。Map 结构的 Iterator 接口,默认就是调用entries方法。
  2. keys() 返回一个遍历器对象,用来遍历所有的键名。
  3. values() 返回一个遍历器对象,用来遍历所有的键值。
// demo
let arr = ['a', 'b', 'c'];
for (let pair of arr.entries()) {
 console.log(pair);
}
// [0, 'a']
// [1, 'b']
// [2, 'c']

类似数组的对象

类似数组的对象包括好几类。下面是for...of循环用于字符串、DOM NodeList 对象、arguments对象的例子。

// 字符串
let 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'

并不是所有类似数组的对象都具有 Iterator 接口,一个简便的解决方法,就是使用Array.from方法将其转为数组。 

let arrayLike = { length: 2, 0: 'a', 1: 'b' };

// 报错
for (let x of arrayLike) {
 console.log(x);
}

// 正确
for (let x of Array.from(arrayLike)) {
 console.log(x); // 'a' // 'b'
}

普通的对象

对于普通的对象,for...of结构不能直接使用,会报错,必须部署了 Iterator 接口后才能使用。

let es6 = {
 edition: 6,
 committee: "TC39",
 standard: "ECMA-262"
};

for (let e in es6) {
 console.log(e);
}
// edition
// committee
// standard

for (let e of es6) {
 console.log(e);
}
// TypeError: es6 is not iterable

解决方法是,使用Object.keys方法将对象的键名生成一个数组,然后遍历这个数组。

for (var key of Object.keys(someObject)) {
 console.log(key + ': ' + someObject[key]);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
判断脚本加载是否完成的方法
May 26 Javascript
用Jquery实现多级下拉框无刷新的联动
Dec 22 Javascript
实用的Jquery选项卡TAB示例代码
Aug 28 Javascript
Javascript中的方法链(Method Chaining)介绍
Mar 15 Javascript
微信小程序 navigation API实例详解
Oct 02 Javascript
将form表单通过ajax实现无刷新提交的简单实例
Oct 12 Javascript
Node.js数据库操作之查询MySQL数据库(二)
Mar 04 Javascript
详谈angularjs中路由页面强制更新的问题
Apr 24 Javascript
通过源码分析Vue的双向数据绑定详解
Sep 24 Javascript
webpack构建换肤功能的思路详解
Nov 27 Javascript
js实现动态增加文件域表单功能
Oct 22 Javascript
前端JS获取URL参数的4种方法总结
Apr 05 Javascript
JavaScript原生数组Array常用方法
Apr 06 #Javascript
微信小程序 图片宽度自适应的实现
Apr 06 #Javascript
微信小程序 下拉菜单的实现
Apr 06 #Javascript
微信小程序五星评分效果实现代码
Apr 06 #Javascript
原生javascript上传图片带进度条【实例分享】
Apr 06 #Javascript
jQuery实现文章图片弹出放大效果
Apr 06 #jQuery
vue.js指令和组件详细介绍及实例
Apr 06 #Javascript
You might like
php 无限级缓存的类的扩展
2009/03/16 PHP
数据库查询记录php 多行多列显示
2009/08/15 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
2020/08/26 PHP
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
vue v-model实现自定义样式多选与单选功能
2018/07/05 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
记一次react前端项目打包优化的方法
2020/03/30 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
最基础的Python的socket编程入门教程
2015/04/23 Python
带你了解python装饰器
2017/06/15 Python
浅谈python的深浅拷贝以及fromkeys的用法
2019/03/08 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
Python flask框架端口失效解决方案
2020/06/04 Python
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
六十岁生日答谢词
2014/01/10 职场文书
电气个人求职信范文
2014/02/04 职场文书
艺人经纪人岗位职责
2014/04/15 职场文书
2014法制宣传日活动总结范文
2014/11/01 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
听证通知书
2015/04/24 职场文书
总结Python使用过程中的bug
2021/06/18 Python
世界十大儿童漫画书排名,法国国宝漫画排第五,第二是轰动日本连环
2022/03/18 欧美动漫
vue动态绑定style样式
2022/04/20 Vue.js