一、Map数据类型
Map类型的出现是为了解决传统JavaScript对象中的键值对的键名只能是字符串,由此会带来一些不便。而Map数据类型类似于对象,也是键值对的集合,但键名可以是任何类型数据,包括Number,Object,Boolean等。
const m = new Map();
const o = {p: 'Hello World'};
m.set(o, 'content')
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
在Map赋值时,若键名是Number,NaN(set时会认为NaN等于它本身)或Boolean,在多次赋同样键名的值会有替换效果。例如:
const map = new Map();
map
.set(1, 'aaa')
.set(1, 'bbb');
map.get(1) // "bbb"
Map数据结构同样有size属性,set(key,value),get(key),has(key),delete(key),clear()方法。
可以通过它的keys(),values(),entries(),或实例(等同于entries)提供的Iterable接口用for/of遍历
const map = new Map([
['F', 'no'],
['T', 'yes'],
]);
for (let key of map.keys()) {
console.log(key);
}
// "F"
// "T"
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "no"
// "T" "yes"
for (let item of map) {
console.log(item);
}
// ["F", "no"]
// ["T", "yes"]
Map方法
var myMap = new Map();
myMap.set("bar", "baz");
myMap.set(1, "foo");
myMap.size; // 2
myMap.has("bar"); // true
myMap.clear();
myMap.size; // 0
myMap.has("bar") // false
使用for...of方法迭代映射
二、Set数据类类型
Set类似于Array,但内部存储的数据不允许重复。该方法可接受具有Iterable接口的其他数据结构作为参数。
let set=new Set([1,2,3,3]);
console.log(set);
// Set(3) {1, 2, 3}
set对象方法:
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
上面代码中,由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。entries不仅返回键值还返回键名。
forEach()方法,set结构的实例和数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值
set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9
上面代码说明,forEach方法的参数就是一个处理函数。该函数的参数与数组的forEach致,依次为键值、键名、集合本身(上例省略了该参数)。这里需要注意,Set 结构的键名就是键值(两者是同一个值),因此第一个参数与第二个参数的值永远都是一样的。
另外,forEach方法还可以有第二个参数,表示绑定处理函数内部this对象。