详解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 相关文章推荐
学习ExtJS form布局
Oct 08 Javascript
23个Javascript弹出窗口特效整理
Feb 25 Javascript
将form表单中的元素转换成对象的方法适用表单提交
May 02 Javascript
jQuery窗口、文档、网页各种高度的精确理解
Jul 02 Javascript
JavaScript 学习笔记之操作符(续)
Jan 14 Javascript
jQuery右下角旋转环状菜单特效代码
Aug 10 Javascript
Jquery常用的方法汇总
Sep 01 Javascript
浅谈JavaScript中的this指针和引用知识
Aug 05 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
Aug 14 jQuery
分享5个小技巧让你写出更好的 JavaScript 条件语句
Oct 20 Javascript
微信小程序canvas绘制圆角base64图片的实现
Aug 18 Javascript
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
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
基于mysql的论坛(5)
2006/10/09 PHP
判断是否为指定长度内字符串的php函数
2010/02/16 PHP
PHP实现多进程并行操作的详解(可做守护进程)
2013/06/18 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
帝国cms常用标签汇总
2015/07/06 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
php获取从百度、谷歌等搜索引擎进入网站关键词的方法
2015/07/08 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
php递归函数怎么用才有效
2018/02/24 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
javascript之锁定表格栏位
2007/06/29 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
前端路由&amp;webpack基础配置详解
2019/06/10 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python yield使用方法示例
2013/12/04 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
pandas数据处理之绘图的实现
2020/06/15 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
PyQt实现计数器的方法示例
2021/01/18 Python
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Nike香港官网:Nike HK
2019/03/23 全球购物
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
网络维护管理员的自我评价分享
2013/11/11 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
项目经理任命书范本
2014/06/05 职场文书
护士求职信
2014/07/05 职场文书
情人节单身感言
2015/08/03 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
《草虫的村落》教学反思
2016/02/20 职场文书