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中substr,substring,slice.splice的区别说明
Nov 25 Javascript
javascript生成随机大小写字母的方法
Feb 20 Javascript
javascript 获取浏览器版本
Jan 21 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
Listloading.js移动端上拉下拉刷新组件
Aug 04 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
Dec 30 Javascript
JS中的数组转变成JSON格式字符串的方法
May 09 Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
微信小程序实现购物页面左右联动
Feb 15 Javascript
vue.js实现备忘录demo
Jun 26 Javascript
vue input标签通用指令校验的实现
Nov 05 Javascript
JS函数参数的传递与同名参数实例分析
Mar 16 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抽奖小程序的实现代码
2013/06/18 PHP
主流PHP框架的优缺点对比分析
2014/12/25 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
idTabs基于JQuery的根据URL参数选择Tab插件
2012/04/11 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
解析JavaScript数组方法reduce
2016/12/12 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
vue组件生命周期详解
2017/11/07 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
python使用Berkeley DB数据库实例
2014/09/26 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
django 发送邮件和缓存的实现代码
2018/07/18 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
Python中断多重循环的思路总结
2019/10/04 Python
Python实现Canny及Hough算法代码实例解析
2020/08/06 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
环境工程与管理大学毕业生求职信
2013/10/02 职场文书
中职应届生会计求职信
2013/10/23 职场文书
班长岗位职责
2013/11/10 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
评先进个人材料
2014/12/29 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
公开致歉信
2019/06/24 职场文书
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技