JavaScript之iterable_动力节点Java学院整理


Posted in Javascript onJune 29, 2017

遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于iterable类型。

具有iterable类型的集合可以通过新的for ... of循环来遍历。

for ... of循环是ES6引入的新的语法,请测试你的浏览器是否支持:

'use strict';
var a = [1, 2, 3];
for (var x of a) {
}
alert('你的浏览器支持for ... of');

for ... of循环遍历集合,用法如下:

var a = ['A', 'B', 'C'];
var s = new Set(['A', 'B', 'C']);
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
for (var x of a) { // 遍历Array
  alert(x);
}
for (var x of s) { // 遍历Set
  alert(x);
}
for (var x of m) { // 遍历Map
  alert(x[0] + '=' + x[1]);
}

你可能会有疑问,for ... of循环和for ... in循环有何区别?

for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。

当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:

var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
  alert(x); // '0', '1', '2', 'name'
}
for ... in循环将把name包括在内,但Array的length属性却不包括在内。
for ... of循环则完全修复了这些问题,它只循环集合本身的元素:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x of a) {
  alert(x); // 'A', 'B', 'C'
}

这就是为什么要引入新的for ... of循环。

然而,更好的方式是直接使用iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数。以Array为例:

var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {
  // element: 指向当前元素的值
  // index: 指向当前索引
  // array: 指向Array对象本身
  alert(element);
});

注意,forEach()方法是ES5.1标准引入的,你需要测试浏览器是否支持。

SetArray类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:

var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
  alert(element);
});

Map的回调函数参数依次为valuekeymap本身:

var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
  alert(value);
});

如果对某些参数不感兴趣,由于JavaScript的函数调用不要求参数必须一致,因此可以忽略它们。例如,只需要获得Arrayelement

var a = ['A', 'B', 'C'];
a.forEach(function (element) {
  alert(element);
});
Javascript 相关文章推荐
利用js实现在浏览器状态栏显示访问者在本页停留的时间
Dec 29 Javascript
JavaScript中number转换成string介绍
Dec 31 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
多个上传文件用js验证文件的格式和大小的方法(推荐)
Mar 09 Javascript
vue实现word,pdf文件的导出功能
Jul 31 Javascript
对vux点击事件的优化详解
Aug 28 Javascript
微信小程序实现顶部导航特效
Jan 28 Javascript
使用 vue 实现灭霸打响指英雄消失的效果附demo
May 06 Javascript
element-ui中Table表格省市区合并单元格的方法实现
Aug 07 Javascript
对vuex中getters计算过滤操作详解
Nov 06 Javascript
Node.js设置定时任务之node-schedule模块的使用详解
Apr 28 Javascript
js实现简单五子棋游戏
May 28 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之面向对象_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之json_动力节点Java学院整理
Jun 29 #Javascript
JavaScript之RegExp_动力节点Java学院整理
Jun 29 #Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 #Javascript
详解vue2父组件传递props异步数据到子组件的问题
Jun 29 #Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
Jun 29 #jQuery
You might like
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
关于laravel5.5的定时任务详解(demo)
2019/10/23 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery实现网站添加高亮突出显示效果的方法
2015/06/26 Javascript
基于jQuery实现点击弹出层实例代码
2016/01/01 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
js 作用域和变量详解
2017/02/16 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
Python os模块介绍
2014/11/30 Python
浅谈Python中函数的参数传递
2016/06/21 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
Python文件监听工具pyinotify与watchdog实例
2018/10/15 Python
python交易记录链的实现过程详解
2019/07/03 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
Python3如何判断三角形的类型
2020/04/12 Python
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
领班岗位职责范文
2014/02/06 职场文书
保安队长职务说明书
2014/02/23 职场文书
会计学专业自荐信
2014/06/25 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
入团申请书格式
2019/06/20 职场文书
导游词之神仙居景区
2019/11/15 职场文书
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
手残删除python之后的补救方法
2021/06/26 Python
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
解决Oracle数据库用户密码过期
2022/05/11 Oracle