1.Set
ES6提供了新的数据结构Set,类似于数组。但是成员的值都是唯一的,没有重复的。
Set本身是一个构造函数,用来生成Set数据结构。Set函数也可以接受一个数组(或者具有iterable接口的其他数据结构)作为参数,用来初始化。
const s = new Set();
const set = new Set([1,2,3,3]);
[...set]
//[1,2,3]去除了数组的重复成员
note:向Set添加值的时候,不会发生类型转换,例如字符串'true'和布尔值true是两个不同的值。其判断方法类似于精确相等运算符,区别在于NaN等于自身,精确相等运算符认为NaN不等于自身。
Set实例的属性与方法:
Set结构的实例属性:
--Set.prototype.constructor:构造函数,默认就是Set函数。
--Set.prototype.size:返回Set实例的成员总数。
Set结构的实例方法:
a. 操作方法:--add(value):添加值,返回Set结构本身。
--delete(value):删除某个值,返回一个布尔值,表示是否删除成功。
--has(value):返回一个布尔值,表示Set结构是否存在该值。
--clear():清除所有成员,没有返回值。
b. 遍历方法:--keys():遍历键名。
--values():遍历键值。
--entries():遍历键值对。
--forEach():使用回调函数遍历每个成员。
note:Set的遍历顺序就是插入顺序。Set没有键名,只有键值,keys方法和values方法行为完全一致。entries方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。
let set = new Set(['one', 'two', 'three']);
for (let item of set.keys()) {
console.log(item);
}
// one
// two
// three
for (let item of set.values()) {
console.log(item);
}
// one
// two
// three
for (let item of set.entries()) {
console.log(item);
}
// ["one", "one"]
// ["two", "two"]
// ["three", "three"]
Set 结构的默认遍历器生成函数是values方法。
Set.prototype[Symbol.iterator] === Set.prototype.values
// true
2.Map
ES6提供了Map数据结构,是键值对的集合,其“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键。Map中的键是和内存地址绑定的,只要内存地址不一样,就认为是两个键(哪怕键的值一样)。如果Map的键是一个简单类型的值,只要值相同,Map将其视为一个键,所以0和-0是一个键。虽然NaN不严格等于 自身,Map视其为同一个键。
Map的属性和操作方法:
(1)size属性:返回Map结构的成员总数。
(2)set(key, value):设置键名key对应的键值为value,返回整个Map结构。可以采用链式写法。
let map = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
(3)get(key):读取key对应的键值。如果找不到key,返回undefined。
(4)has(key):返回一个布尔值,表示当前Map是否存在该键。
(4)delete(key):删除某个键,成功返回true,否则false。
(5)clear():清除所有成员,没有返回值。
Map遍历方法:(Map 的遍历顺序就是插入顺序。)
--keys():返回键名的遍历器。
--values():返回键值的遍历器。
--entries():返回所有成员的遍历器。
--forEach():遍历 Map 的所有成员。
note:Map 结构的默认遍历器接口( Symbol.iterator属性),就是entries方法。
const map = new Map([
['F', 'false'],
['T', 'true'],
]);
// 等同于使用map.entries 即 for (let [key, value] of map.entries())
for (let [key, value] of map) {
console.log(key, value);
}
// "F" "false"
// "T" "true"