文章目录
Set集合
Set集合是什么
Set对象是值的集合,可以按照插入的顺序迭代它的元素。Set集合中的元素只会出现一次,即Set集合中的元素时唯一的
ECMAScript 6提供了Set构造函数,能够创建Set对象
Set集合–值是唯一的集合
我们可以利用Set集合为数组元素去掉重复的值。
const arr = [1, 2, 3, 3, 4, 5, 2]
let set = new Set(arr)
console.log(set) //Set { 1, 2, 3, 4, 5 }
NaN、undefined等值允许被存储在Set集合中
NaN值在Set集合中被认为是相等的
console.log(undefined === undefined) //true
let set2 = new Set([NaN, NaN, undefined, undefined, null, null])
console.log(set2) //Set { NaN, undefined, null }
Set集合中存储复杂数据类型(数组、对象及函数等)
多个空数组和对象表示多个值
多个函数依旧也表示多个值
console.log([] === [])
let set3 = new Set([[],[], {}, {},function() {},function() {}])
console.log(set3) //Set { [], [], {}, {}, [Function], [Function] }
Set集合的属性与方法
属性
属性名称 | 描述 |
---|---|
constructor | 构造函数,默认就是Set 函数 |
size | 返回Set 对象的值的个数。 |
let set = new Set([1,2,3,4,5])
// set的size属性相当于数组中的length属性
console.log(set.size);// 5
1234
操作方法
方法名称 | 描述 |
---|---|
add(value) | 添加某个值,返回 Set 结构本身 |
delete(value) | 删除某个值(不是索引值 ),返回一个布尔值,表示删除是否成功 |
has(value) | 返回一个布尔值,表示该值是否为Set 的成员 |
clear() | 清除所有成员,没有返回值 |
//add(value)--向Set集合的结尾添加新的元素
// 返回值--添加新元素后的Set集合
var result = set.add(6)
console.log(set, result) //Set { 1, 2, 3, 4, 5, 6 } Set { 1, 2, 3, 4, 5, 6 }
// delete(value)--从Set集合删除指定元素
// value--表示Set集合中的元素内容(值)
// 返回值--布尔值,true表示删除成功,false表示删除失败
var result = set.delete(1)
console.log(set, result) //Set { 2, 3, 4, 5, 6 } true
//has(value)--判断指定Set集合中是否包含指定元素
// value--表示Set集合中的元素内容(值)
// 返回值--布尔值,true表示包含,false表示不包含
var result = set.has(1)
console.log(result) //false
// clear()清空操作
set.clear()
console.log(set) //Set {}
创建Set集合
1.使用数组将Set集合进行初始化操作
let set1 = new Set([1, 2, 3, 4, 5])
console.log(set1) //Set { 1, 2, 3, 4, 5 }
2.创建空的Set集合,利用add()方法向Set集合添加元素
let set2 = new Set()
set2.add(1)
set2.add(2)
set2.add(3)
console.log(set2) //Set { 1, 2, 3 }
3.支持链式操作–add()方法调用完毕后返回添加新元素后的Set集合
let set3 = new Set().add(1).add(2).add(3)
console.log(set3) //Set { 1, 2, 3 }
遍历方法
方法名称 | 描述 |
---|---|
values() | 返回一个新的迭代器对象,该对象包含 Set集合中的按插入顺序 排列的所有元素的值 |
keys() | 与values0方法相同 |
entries() | 返回一个新的迭代器对象,该对象包含Set集合中的按插入顺序 排列的所有元素的值的[value, value]数组 |
forEach() | 按照插入顺序,为 Set 集合中的每一个元素调用一次callback函数 |
values() - 返回的当前set集合中所有值的迭代器对象
keys() - 返回的当前set集舍中所有键的迭代器对象
entries() - 返回的当前Set集合中所有键值的迭代器对象
let set = new Set([1, 2, 3, 4, 5]);
/*
values()方法 - 返回一个迭代器对象(SetIterator)
*没有length属性值 – 常规的循环语句无法使用
*不能for...in循环语句
*只能使用for...of进行循环
*/
// console.log(set.values());// [Set Iterator] { 1, 2, 3, 4, 5 }
var iterator = set.values()
for (var name of iterator) {
console.log(name); //1 2 3 4 5
}
/*
虽然set集合具有size属性–表示当前set集合中元素的个数
但是Set集合获取每一个元素内容,不能使用set[索引值]的方式
*/
for (let i = 0; i < set.size; i++) {
console.log(set[i]); //undefined undefined undefined undefined undefined
}
/*
set集合提供的遍历的方法
* values() - 返回的当前set集合中所有值的迭代器对象
* keys() - 返回的当前set集舍中所有键的迭代器对象
* entries() - 返回的当前Set集合中所有键值的迭代器对象
* Set集合的特殊 - set集合中键与值相同
*/
console.log(set.entries()); // [Set Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ], [ 4, 4 ], [ 5, 5 ] }
set集合提供forEach()方法
- 作用 ― 用于遍历当前的Set集台(为Set集合中每个元素调用callback函数)
- 回调函数 – function (value,key,set){}
- value - 表示当前Set集合中每一个值
- key - 表示当前Set集合中每一个键
- 表示当前Set集合中每一个键
- set - 表示当前遍历的Set集合
set.forEach(function(value, key, set) {
console.log(value, key, set);
})
// 1 1 Set { 1, 2, 3, 4, 5 }
// 2 2 Set { 1, 2, 3, 4, 5 }
// 3 3 Set { 1, 2, 3, 4, 5 }
// 4 4 Set { 1, 2, 3, 4, 5 }
// 5 5 Set { 1, 2, 3, 4, 5 }
Set集合与Array对比
- 数组中用于判断元素是否存在的indexOf()函数效率低下。
- Set 对象允许根据值删除元素,而数组中必须使用基于下标的
splice()
方法。 - 数组的 indexOf()方法无法找到
NaN
值。 - Set对象存储不重复的值,所以不需要手动处理包含重复值的情况。
WeakSet集合
WeakSet是什么
WeakSet对象是一些对象值的集合,并且其中的每个对象值都只能出现一次。
WeakSet 对象与Set 对象的区别主要有两点:
Set | WeakSet |
---|---|
存放对象引用和值 | 只能存放对象引用 ,不能存放值 |
对象是值的集合 | 对象都是弱引用,没有枚举和遍历迭代 |
WeakSet集合只能存储对象,存储的内容无法被枚举
var ws = new WeakSet()
var obj1 = {
name: '林俊杰'
}
var obj2 = {
name: '周杰伦'
}
ws.add(obj1)
ws.add(obj2)
console.log(ws.has(obj1)) //true
console.log(ws)
Map集合
Map集合是什么
- Map集合是键值对的集合。
- 任何值都可以作为Map集合中的键或值。
- Map 集合可以按照插入的顺序迭代它的元素。
Map集合的属性与方法
属性
- size - 返回 Map 结构的成员总数。
方法
方法名称 | 描述 |
---|---|
set(key, value) | 设置Map对象中键的值。返回该 Map 对象 |
get(key) | 返回键对应的值。如果不存在,则返回undefined |
delete(key) | 从Map 集合删除指定的键值对。返回布尔值,表示是否删除成功 |
has(key) | 检索Map 集合是否包含指定键对应的值。返回布尔值,表示是否包含 |
clear() | 清除 Map集合中所有键值对,没有返回值 |
values() | 返回一个新的迭代器对象,该对象包含 Map集合中所有元素的值 |
keys() | 与values()方法相同 |
entries() | 返回一个新的迭代器对象,该对象包含Map 集合中的按插入顺序排列的所有元素的值的[key, value]数组 |
forEach() | 按照插入顺序,为Map 集合中的每一个元素调用一次callback函数 |
// 创建Map集合--空集合
let map = new Map()
let num = 100,
str = '林俊杰',
fun = function() {},
obj = {}
map.set('num', num)
map.set('str', str)
map.set('fun', fun)
map.set('obj', obj)
console.log(map)
// Map {
// 'num' => 100,
// 'str' => '林俊杰',
// 'fun' => [Function: fun],
// 'obj' => {}
// }
//得到对应的值
console.log(map.get('str')) //林俊杰
//删除
map.delete('num')
console.log(map) //Map { 'str' => '林俊杰', 'fun' => [Function: fun], 'obj' => {} }
//清空
map.clear()
console.log(map) //Map {}
console.log(map.values()); // [Map Iterator] { '林俊杰', [Function: fun], {} }
console.log(map.keys()); // [Map Iterator] { 'str', 'fun', 'obj' }
Map集合键的相等
Map集合的键的比较是基于“SameValueZero”算法:
- 判断使用与===相似的规则。
- -0和+0相等。
- NaN 与自身相等(与===有所不同)。
Map集合与Object对比
一般情况下,Object 会被用于将字符串类型映射到数值。Object 允许设置键值对、根据键获取值、删除键、检测某个键是否存在。而 Map具有更多的优势:
- Object 的键均为String 类型,在 Map里键可以是任意类型。
- 必须手动计算 Object 的尺寸,但是可以很容易地获取使用Map的尺寸。
- Map 的遍历遵循元素的插入顺序。
- Object有原型,所以映射中有一些缺省的键。
WeakMap集合
WeakMap集合是什么
用于生成键值对的集合
它的键
必须是对象类型
,值
可以是任意类型
,不可枚举
WeakMap集合的方法
方法名称 | 描述 |
---|---|
set(key, value) | 设置WeakMap 对象中键的值。返回该WeakMap对象 |
get(key) | 返回键对应的值。如果不存在,则返回undefined |
delete(key) | 从WeakMap 集合删除指定的键值对。返回布尔值,表示是否删除成功 |
has(key) | 检索WeakMap集合是否包含指定键对应的值。返回布尔值,表示是否包含 |