[ES6]---Set集合、Map集合、WeakSet集合、WeakMap集合

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 对象的区别主要有两点:

SetWeakSet
存放对象引用和值只能存放对象引用,不能存放值
对象是值的集合对象都是弱引用,没有枚举和遍历迭代

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集合是否包含指定键对应的值。返回布尔值,表示是否包含
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值