[JavaScript] (Day-07) - Iterable

JavaScript
中的默认对象表示方式为{...}
,类似于iOS
中的 Dictionary
数据结构,即都用键值对组成;
但是JavaScript的对象有个局限,就是键必须是字符串,但实际上Number
或者其他数据类型作为键也是非常合理的,于是引进了一个新的类型Map
, 一个也是由键值对组成的数据结构,但是其健可以是Number
或者其他数据类型;
Map
Map是一组键值对的结构,具有极快的查找速度
初始化Map
需要一个二维数组,或者直接初始化一个空Map
初始化方式一:
我们将一组人的 name
和 score
放到一个Map
中, 通过 name
查找对应 score
var m = new Map([["Michael", 95], ["Bob", 75], ["Tracy", 85]]);
m.get('Michael'); // 95
我们将一组人的 name
和 score
放到一个Map
中, 通过 score
查找对应 name
var m = new Map([[95, "Michael"], [75, "Bob"], [85, "Tracy"]]);
m.get(85); // "Tracy"
初始化方式二:
var m = new Map(); // 空Map
m.set("Adam", 67); // 添加新的key-value
m.set("Bob", 59);
m.has("Adam"); // 是否存在key "Adam": true
m.get("Adam"); // 67
m.delete("Adam"); // 删除key 'Adam'
m.get("Adam"); // undefined
由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:
var m = new Map();
m.set("Adam", 67);
m.set("Adam", 88);
m.get("Adam"); // 88
Set
Set
类似与iOS
中的集合
Set
类似于数组,但是元素是无序的,而且不能重复
要创建一个Set
,需要提供一个Array
作为输入,或者直接创建一个空Set
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3
重复元素在Set
中自动被过滤:
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
注意数字3
和字符串'3'
是不同的元素。
Set
的增删操作:
var s = new Set([1, 2, 3]); // 含1, 2, 3
s.add(4); // Set {1, 2, 3, 4}
s.delete(3); // Set {1, 2, 4}
Iterable类型
遍历Array
可以采用下标循环,遍历Map
和Set
就无法使用下标。
Array
、Map
和Set
都属于iterable
类型。
具有iterable
类型的集合可以通过新的for...of
循环来遍历。
用for ... of循环遍历集合,用法如下:
// 数组 Array
var a = ["A", "B", "C"];
// 集合 Set
var s = new Set(["A", "B", "C"]);
// Map
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]); // x[0]->key值, x[1]->Value值
}
for ... of循环和for ... in循环有何区别?
for...in
它遍历的实际上是对象的属性名称。一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
for ... of
循环,它只循环集合本身的元素
forEach
iterable内置的forEach方法,它接收一个函数,每次迭代就自动回调该函数
var a = ["A", "B", "C"];
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
alert(element);
});
如果对某些参数不感兴趣,可以忽略它们, 因为JavaScript
的函数调用不要求参数必须一致
var a = ["A", "B", "C"];
a.forEach(function (element) {
alert(element);
});