详解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 相关文章推荐
如何实现修改密码时密码框显示保存到cookie的密码
Dec 10 Javascript
javascript实现切换td中的值
Dec 05 Javascript
node.js中的fs.utimesSync方法使用说明
Dec 15 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
Apr 17 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
Feb 21 Javascript
jquery实现input框获取焦点的简单实例
Jan 26 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
Jan 09 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 Javascript
layui富文本编辑器前端无法取值的解决方法
Sep 18 Javascript
javascript实现电商放大镜效果
Nov 23 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/02 无线电
php中定时计划任务的实现原理
2013/01/08 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
2013/07/01 PHP
PHP children()函数讲解
2019/02/03 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
php使用pthreads v3多线程实现抓取新浪新闻信息操作示例
2020/02/21 PHP
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
javascript匀速运动实现方法分析
2016/01/08 Javascript
Angular.js自动化测试之protractor详解
2017/07/07 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
详解js常用分割取字符串的方法
2019/05/15 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
Python入门及进阶笔记 Python 内置函数小结
2014/08/09 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
实践Vim配置python开发环境
2018/07/02 Python
python反转列表的三种方式解析
2019/11/08 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
HTML5未来发展趋势
2016/02/01 HTML / CSS
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
First Aid Beauty官网:FAB急救面霜
2018/05/24 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
幼儿教师培训感言
2014/03/08 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
论文评审意见
2015/06/05 职场文书
基督教追悼会答谢词
2015/09/29 职场文书
拔河比赛队名及霸气口号
2015/12/24 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
php访问对象中的成员的实例方法
2021/11/17 PHP