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 相关文章推荐
JavaScript 判断浏览器是否支持SVG的代码
Mar 21 Javascript
JQuery触发事件例如click
Sep 11 Javascript
JavaScript中的style.cssText使用教程
Nov 06 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
Vue.js第三天学习笔记(计算属性computed)
Dec 01 Javascript
vue-cli的eslint相关用法
Sep 29 Javascript
ReactJS实现表单的单选多选和反选的示例
Oct 13 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
Apr 25 Javascript
Vue中在新窗口打开页面及Vue-router的使用
Jun 13 Javascript
vue-cli监听组件加载完成的方法
Sep 07 Javascript
微信小程序如何获取用户收货地址
Nov 27 Javascript
JavaScript TAB栏切换效果的示例
Nov 05 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 empty函数 使用说明
2009/08/10 PHP
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
PHP删除数组中特定元素的两种方法
2013/07/02 PHP
php中fsockopen用法实例
2015/01/05 PHP
PHP网络操作函数汇总
2015/05/18 PHP
PHP编程中的__clone()方法使用详解
2015/11/27 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
2016/04/30 PHP
通过实例解析PHP数据类型转换方法
2020/07/11 PHP
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
JavaScript 图片预览效果 推荐
2009/12/22 Javascript
js 数组克隆方法 小结
2010/03/20 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
javascript中href和replace的比较(详解)
2016/11/25 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
原生JavaScript实现购物车
2021/01/10 Javascript
python正则表达式中的括号匹配问题
2014/12/14 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
2015/12/08 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
django模板语法学习之include示例详解
2017/12/17 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
Python读取文件内容为字符串的方法(多种方法详解)
2020/03/04 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
大学生求职简历的自我评价
2013/10/14 职场文书
开学典礼决心书
2014/03/11 职场文书
助残日活动总结
2014/08/27 职场文书
2014年维稳工作总结
2014/11/18 职场文书
2015年党建工作总结
2015/03/30 职场文书
vue+elementui 实现新增和修改共用一个弹框的完整代码
2021/06/08 Vue.js
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python