[ES6] 细化ES6之 -- 键值对集合

Set集合
Set集合是什么
  • Set对象是值的集合,可以按照插入的顺序迭代它的元素。

  • 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}
// console.log(Set.prototype);// Set {}

 

NaN. undefined等值允许被存储在Set集合中

NaN值在Set集合中被认为是相等的

let set1 = new Set([NaN,NaN,undefined,undefined,null,null])
console.log(set1);// Set { NaN,undefined,null }

console.log(undefined === undefined);//true

 

  • set集合中存储复杂数据类型(数组、对象及函数等)
    • 空数组和空对象表示多个值
    • 多个函数依旧也表示多个值
console.log([] === []);// false
console.log({} === {});// false
let set2 = new Set([[],[],{},{},function () {},function () {}])
console.log(set2);// 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

 

操作方法
方法名称描述
add(value)添加某个值,返回 Set 结构本身
delete(value)删除某个值(不是索引值),返回一个布尔值,表示删除是否成功
has(value)返回一个布尔值,表示该值是否为Set的成员
clear()清除所有成员,没有返回值
/*
    add (value) -向Set集合的结尾添加新的元素
        *返回值 – 添加新元素后的Set集合
 */
set.add(6)
console.log(set);// Set { 1, 2, 3, 4, 5, 6 }

/*
    delete(value) - 从set集合删除指定元素
        *value - 表示Set集合中的元素内容(值)
        *返回值 - 布尔值,true表示删除成功,false表示删除失败
 */
set.delete(1)
console.log(set);// Set { 2, 3, 4, 5, 6 }

/*
    has (value) - 判断指定Set集合中是否包含指定元素
        *value - 表示Set集合中的元素内容(值)
        *返回值 - 布尔值,true表示包含,false表示不包含
 */
var result = set.has(4)
console.log(result);// true

// clear() - 清空所有成员
set.clear()
console.log(set);// Set {}

 

遍历方法
方法名称描述
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);
}


/*
    虽然set集合具有size属性–表示当前set集合中元素的个数
    但是Set集合获取每一个元素内容,不能使用set[索引值]的方式
*/
for (let i=0; i<set.size; i++) {
    console.log(set[i]);
}


/*
    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).add(obj2);
console.log(ws);// WeakSet { <items unknown> }

 

WeakSet集合的方法
方法名称描述
add(value)在WeakSet 集合尾部添加一个元素,返回该WeakSet 对象
delete(value)从 WeakSet集合删除指定的元素。返回布尔值,表示是否删除成功
has(value)检索WeakSet 集合是否包含指定的元素。返回布尔值,表示是否包含
clear()清除WeakSet集合中所有元素,没有返回值

 

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);

console.log(map.get('str'));//张无忌

map.delete('num')
console.log(map);//Map { 'str' => '张无忌', 'fun' => [Function: fun], 'obj' => {} }

var result = map.has('str')
console.log(result);// true

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值