详解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 Function对象扩展之延时执行函数
Jul 06 Javascript
js 数组去重的四种实用方法
Sep 09 Javascript
如何编写高质量JS代码
Dec 28 Javascript
检测一个函数是否是JavaScript原生函数的小技巧
Mar 13 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 Javascript
jQuery选择器总结之常用元素查找方法
Aug 04 Javascript
大白话讲解JavaScript的Promise
Apr 06 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
node文件批量重命名的方法示例
Oct 23 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
Aug 12 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
Nov 26 Javascript
js实现计时器秒表功能
Dec 16 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 Smarty模板生成html文档的方法
2010/04/12 PHP
php 函数中使用static的说明
2012/06/01 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
php常用字符函数实例小结
2016/12/29 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
JavaScript 函数调用规则
2009/09/14 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
jQuery - css() 方法示例详解
2014/01/16 Javascript
jquery实现的鼠标下拉滚动置顶效果
2014/07/24 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JS中取二维数组中最大值的方法汇总
2016/04/17 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
浅谈NodeJs之数据库异常处理
2017/10/25 NodeJs
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
python字符串str和字节数组相互转化方法
2017/03/18 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
2017/07/12 Python
Python中enumerate函数代码解析
2017/10/31 Python
Python+OpenCV实现车牌字符分割和识别
2018/03/31 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
2019/02/21 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
Python基础知识点 初识Python.md
2019/05/14 Python
Python如何输出警告信息
2020/07/30 Python
Django crontab定时任务模块操作方法解析
2020/09/10 Python
python 利用百度API识别图片文字(多线程版)
2020/12/14 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
人力资源求职信
2014/05/25 职场文书
水电工程师岗位职责
2015/02/13 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
电台广播稿范文
2015/08/19 职场文书
生日寿星公答谢词
2015/09/29 职场文书
2016秋季小学开学寄语
2015/12/03 职场文书