Set()
Set类似于数组,但是成员的值都是唯一的,没有重复的值。Set 本身是一个构造函数,用来生成 Set 数据结构。
const s = new Set();
let arr = [2, 3, 5, 4, 5, 2, 2]
arr.forEach(x => s.add(x));
console.log(s); //Set(4) { 2, 3, 5, 4 }
Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。
let arr = [12,3,24,12,3,24]
console.log([...new Set(arr)]) //[ 12, 3, 24 ]
Set实例的属性和方法。
属性和方法 | 描述 |
---|---|
Set.prototype.constructor | 构造函数,默认就是Set函数。 |
Set.prototype.size | 返回Set实例的成员总数。 |
add(value) | 添加某个值,返回Set结构本身。 |
delete(value) | 删除某个值,返回一个布尔值,表示删除是否成功。 |
has(value) | 返回一个布尔值,表示该值是否为Set的成员。 |
clear() | 清除所有成员,没有返回值。 |
keys() | 返回键名的遍历器 |
values() | 返回键值的遍历器 |
entries() | 返回键值对的遍历器 |
forEach() | 使用回调函数遍历每个成员 |
let s = new Set()
//添加数据
s.add(10)
s.add(10) //重复的数据自动过滤
s.add(20)
console.log(s) //Set(2) { 10, 20 }
console.log(s.has(10)) //true
console.log(s.size) //2
//删除
s.delete(20)
console.log(s) //Set(1) { 10 }
//清空
s.clear()
console.log(s) //Set(0) {}
let values = s.values()
console.log(values) //[Set Iterator] { }
Map()
Map类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
也就是说,Object 结构提供了 “字符串—值” 的对应,Map结构提供了 “值—值” 的对应,是一种更完善的 Hash 结构实现。如果你需要 “键值对” 的数据结构,Map 比 Object 更合适。
Map 可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
const map = new Map([ ['name', '张三'], ['title', 'Author'] ]);
console.log(map) //Map(2) { 'name' => '张三', 'title' => 'Author' }
Map实例的属性和方法。
属性和方法 | 描述 |
---|---|
Set.prototype.size | 返回 Map 结构的成员总数。 |
set(key, value) | 设置键名key对应的键值为value,返回整个 Map 结构。 |
get(key) | 读取key对应的键值,如果找不到key,返回undefined。 |
has(key) | 返回一个布尔值,表示某个键是否在当前 Map 对象之中。 |
delete(key) | 删除某个键,返回true。如果删除失败,返回false。 |
clear() | 清除所有成员,没有返回值 |
keys() | 返回键名的遍历器 |
values() | 返回键值的遍历器 |
entries() | 返回键值对的遍历器 |
forEach() | 使用回调函数遍历每个成员 |
let map = new Map()
//添加数据
map.set('name','tom')
map.set('age',12)
console.log(map) //Map(2) { 'name' => 'tom', 'age' => 12 }
console.log(map.has('name')) //true
//删除
map.delete('name')
console.log(map) //Map(1) { 'age' => 12 }
//清空
map.clear()
console.log(map) //Map(0) {}
Iterator【遍历器】
遍历器是一种接口,为各种不同的数据结构提供统一的访问机制,即for…of循环。任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)。
Iterator 的遍历过程:
- 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
- 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
- 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
- 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
let s = new Set([12,3,4])
let values = s.values()
console.log(values) //[Set Iterator] { 12, 3, 4 }
console.log(values.next()) //{ value: 12, done: false }
console.log(values.next()) //{ value: 3, done: false }
console.log(values.next()) //{ value: 4, done: false }
console.log(values.next()) //{ value: undefined, done: true }
原生具备 Iterator 接口的数据结构有:Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象 等。