详解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 相关文章推荐
javascript attachEvent和addEventListener使用方法
Mar 19 Javascript
基于JQuery的动态删除Table表格的行和列的代码
May 12 Javascript
SinaEditor使用方法详解
Dec 28 Javascript
原生javascript实现匀速运动动画效果
Feb 26 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
Sep 19 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
Bootstrap 3 按钮标签实例代码
Feb 21 Javascript
JavaScript数据结构中串的表示与应用实例
Apr 12 Javascript
Js中将Long转换成日期格式的实现方法
Jun 05 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
vue设置导航栏、侧边栏为公共页面的例子
Nov 01 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调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
2012/08/08 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
解javascript 混淆加密收藏
2009/01/16 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
无阻塞加载脚本分析[全]
2011/01/20 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
2014/11/24 Javascript
jQuery表格行上移下移和置顶的实现方法
2015/10/08 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
ZK中使用JS读取客户端txt文件内容问题
2019/11/07 Javascript
Openlayers绘制聚合标注
2020/09/28 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
[42:20]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
2016/12/18 Python
padas 生成excel 增加sheet表的实例
2018/12/11 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
打包PyQt5应用时的注意事项
2020/02/14 Python
PyCharm中配置PySide2的图文教程
2020/06/18 Python
CSS3转换功能transform主要属性值分析及实现分享
2012/05/06 HTML / CSS
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
法国和欧洲海边和滑雪度假:Pierre & Vacances
2017/01/04 全球购物
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
医生实习工作总结的自我评价
2013/09/27 职场文书
大学生水文观测实习自我鉴定
2013/09/29 职场文书
保洁主管岗位职责
2013/11/20 职场文书
美发活动策划书
2014/01/14 职场文书
党员贯彻十八大精神思想汇报范文
2014/10/25 职场文书
用Python实现一个打字速度测试工具来测试你的手速
2021/05/28 Python