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 onpropertychange输入框 事件获取属性
Mar 26 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
Jul 17 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
如何利用JSHint减少JavaScript的错误
Aug 23 Javascript
JavaScript适配器模式详解
Oct 19 Javascript
createObjectURL方法实现本地图片预览
Sep 30 Javascript
Element Card 卡片的具体使用
Jul 26 Javascript
解决idea开发遇到javascript动态添加html元素时中文乱码的问题
Sep 29 Javascript
Webpack5正式发布,有哪些新特性
Oct 12 Javascript
详解如何使用React Hooks请求数据并渲染
Oct 18 Javascript
Vue+Flask实现图片传输功能
Apr 01 Vue.js
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中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
php修改指定文件后缀的方法
2014/09/11 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
Confirmer JQuery确认对话框组件
2010/06/09 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery 获取浏览器所在的IP地址的小例子
2013/11/08 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
vue轮播组件实现$children和$parent 附带好用的gif录制工具
2019/09/26 Javascript
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
详解【python】str与json类型转换
2019/04/29 Python
python 获取等间隔的数组实例
2019/07/04 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
使用python绘制温度变化雷达图
2019/10/18 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
教师实习的自我鉴定
2013/10/26 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
分公司经理任命书
2014/06/05 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
中学生思想品德评语
2014/12/31 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
导游词之贵州织金洞
2019/10/12 职场文书
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
R9700摩机记
2022/04/05 无线电