详解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 相关文章推荐
如何实现浏览器上的右键菜单
Jul 10 Javascript
JS启动应用程序的一个简单例子
May 11 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
jQuery插件boxScroll实现图片轮播特效
Jul 14 Javascript
JavaScript实现给按钮加上双重动作的方法
Aug 14 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 Javascript
jQuery实现点击任意位置弹出层外关闭弹出层效果
Oct 19 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
Jan 21 Javascript
Angularjs验证用户输入的字符串是否为日期时间
Jun 01 Javascript
JS库之Particles.js中文开发手册及参数详解
Sep 13 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
Dec 26 Javascript
JS 事件机制完整示例分析
Jan 15 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
php.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
8个PHP数组面试题
2015/06/23 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
php数组函数array_walk用法示例
2016/05/26 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
JavaScript实现找出数组中最长的连续数字序列
2014/09/03 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
JS鼠标拖拽实例分析
2015/11/23 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
AngularJS表单验证功能
2017/10/19 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python greenlet实现原理和使用示例
2014/09/24 Python
如何用python整理附件
2018/05/13 Python
Linux系统(CentOS)下python2.7.10安装
2018/09/26 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Python bytes string相互转换过程解析
2020/03/05 Python
Book Depository亚太地区:一家领先的国际图书零售商
2019/05/05 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
会计专业自我鉴定范文
2013/10/06 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
进口业务员岗位职责
2014/04/06 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏