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 事件属性绑定带参数的函数
Mar 13 Javascript
javascript深入理解js闭包
Jul 03 Javascript
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
JavaScript 实现鼠标拖动元素实例代码
Feb 24 Javascript
javascript获取当前鼠标坐标的方法
Jan 10 Javascript
Node.js的环境安装配置(使用nvm方式)
Oct 11 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
Nov 09 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
让webpack+vue-cil项目不再自动打开浏览器的方法
Sep 27 Javascript
JavaScript中七种流行的开源机器学习框架
Oct 11 Javascript
Layui选项卡制作历史浏览记录的方法
Sep 28 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 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概述.
2006/10/09 PHP
Phpbean路由转发的php代码
2008/01/10 PHP
PHP中的string类型使用说明
2010/07/27 PHP
PHP自带函数给数字或字符串自动补齐位数
2014/07/29 PHP
laravel ORM 只开启created_at的几种方法总结
2018/01/29 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
JavaScript中的数值范围介绍
2014/12/29 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
2016/06/01 Javascript
JS实现的自定义水平滚动字体插件完整实例
2016/06/17 Javascript
第一次接触神奇的前端框架vue.js
2016/12/01 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
vue 地区选择器v-distpicker的常用功能
2019/07/23 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python实现爬取千万淘宝商品的方法
2015/06/30 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
诺思信科技(南京)有限公司.NET笔试题答案
2013/07/06 面试题
医务人员自我评价
2014/01/26 职场文书
公证委托书大全
2014/04/04 职场文书
《画家乡》教学反思
2014/04/22 职场文书
机械加工与数控专业自荐书
2014/06/04 职场文书
标准单位租车协议书
2014/09/23 职场文书
交通事故调解协议书
2015/05/20 职场文书
《大禹治水》教学反思
2016/02/22 职场文书