es6之数据结构 set,WeakSet,mapWeakMap
Posted sunmarvell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es6之数据结构 set,WeakSet,mapWeakMap相关的知识,希望对你有一定的参考价值。
{ let list = new Set(); list.add(1); list.add(2); list.add(1); console.log(list); //Set(2) {1, 2} let arr=[1,2,3,1,2] let list2=new Set(arr); console.log(list2); //Set(3) {1, 2, 3} }
Set
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set 本身是一个构造函数,用来生成 Set 数据结构。
{ let list = new Set(); list.add(5); list.add(7); console.log(list.size); //2 }
Set 函数可以接受一个数组作为参数,用来初始化。
{ let arr = [1,2,3,4,5]; let list = new Set(arr); console.log(list.size); //5 }
Set中重复的元素不会添加,可以用于去重
Set不会转换数据类型,数字就是数字,字符串就是字符串
{ let arr=[1,2,3,1,‘2‘] let list2=new Set(arr); console.log(list2); //Set(4) {1, 2, 3, "2"} }
在 Set 内部,两个NaN
是相等。
let set = new Set(); let a = NaN; let b = NaN; set.add(a); set.add(b); set // Set {NaN}
两个对象总是不相等的。
let set = new Set(); set.add({}); set.size // 1 set.add({}); set.size // 2
Set 实例的属性和方法
Set 实例的方法分为两大类:操作方法(用于操作数据)和遍历方法(用于遍历成员)。
四个操作方法:
add(value)
:添加某个值,返回 Set 结构本身。delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。has(value)
:返回一个布尔值,表示该值是否为Set
的成员。clear()
:清除所有成员,没有返回值。
{ let arr=[‘add‘,‘delete‘,‘clear‘,‘has‘]; let list=new Set(arr); console.log(list.has(‘add‘)); //true console.log(list.delete(‘add‘),list); //true Set(3){"delete", "clear", "has"} list.clear(); //清空 console.log(list); // Set(0){} }
forEach()
Set 结构的实例与数组一样,也拥有forEach
方法,用于对每个成员执行某种操作,没有返回值。
{ let arr=[‘add‘,‘delete‘,‘clear‘,‘has‘]; let list=new Set(arr); for(let key of list.keys()){ console.log(key); // add delete clear has } for(let value of list.values()){ console.log(value); // add delete clear has } for(let [key,value] of list.entries()){ console.log(key,value); // add add delete delete clear clear has has } list.forEach(function(item){console.log(item);}) // add delete clear has }
Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的values
方法。
这意味着,可以省略values
方法,直接用for...of
循环遍历 Set。
{ let set = new Set([‘red‘, ‘green‘, ‘blue‘]); for (let x of set) { console.log(x); } // red // green // blue
WeakSet
WeakSet 的成员只能是对象,而不能是其他类型的值。
{ let weakList=new WeakSet(); let arg={}; weakList.add(arg); console.log(weakList); //{{}} }
const ws = new WeakSet(); ws.add(1) // TypeError: Invalid value used in weak set ws.add(Symbol()) // TypeError: invalid value used in weak set
WeakSet 可以接受一个数组或类似数组的对象作为参数。
{const a = [[1, 2], [3, 4]]; const ws = new WeakSet(a); console.log(ws)} //WeakSet {Array(2), Array(2)} //__proto__:WeakSet //[[Entries]]:Array(2) //0:Array(2) //value:(2) [3, 4] //1:Array(2) //value:(2) [1, 2] //length:2
注意,是a
数组的成员成为 WeakSet 的成员,而不是a
数组本身。这意味着,数组的成员只能是对象。
{ const b = [3, 4]; const ws = new WeakSet(b); // Uncaught TypeError: Invalid value used in weak set(…) }
WeakSet 结构有以下三个方法。
add(value)
:添加某个值,返回 WeakSet结构本身。delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。has(value)
:返回一个布尔值,表示该值是否为WeakSet的成员。
const ws = new WeakSet(); const obj = {}; const foo = {}; ws.add(window); ws.add(obj); ws.has(window); // true ws.has(foo); // false ws.delete(window); ws.has(window); // false
WeakSet 没有size
属性,没有办法遍历它的成员。
ws.size // undefined ws.forEach // undefined
Map
javascript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制.
ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
const m = new Map(); const o = {p: ‘Hello World‘}; m.set(o, ‘content‘) m.get(o) // "content" m.has(o) // true m.delete(o) // true m.has(o) // false
Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
const map = new Map([ [‘name‘, ‘张三‘], [‘title‘, ‘Author‘] ]); map.size // 2 map.has(‘name‘) // true map.get(‘name‘) // "张三" map.has(‘title‘) // true map.get(‘title‘) // "Author"
如果对同一个键多次赋值,后面的值将覆盖前面的值。
const map = new Map(); map .set(1, ‘aaa‘) .set(1, ‘bbb‘); map.get(1) // "bbb"
实例的属性和操作方法
(1)size 属性
(2)set(key, value)
(3)get(key)
(4)has(key)
(5)delete(key)
(6)clear()
{ let map = new Map(); map.set(‘foo‘, 11); map.set(‘bar‘, 22); map.size ;// 2 map.get(‘foo‘);//t1 map.has(‘boo‘); //true map.delete(‘foo‘); //true map.clear(); map.size // 0 }
遍历方法
Map 结构原生提供三个遍历器生成函数和一个遍历方法。
keys()
:返回键名的遍历器。values()
:返回键值的遍历器。entries()
:返回所有成员的遍历器。forEach()
:遍历 Map 的所有成员。
Map 结构的默认遍历器接口(Symbol.iterator
属性),就是entries
方法。
WeakMap
WeakMap
结构与Map
结构类似,也是用于生成键值对的集合。
WeakMap
与Map
的区别有两点。
首先,WeakMap
只接受对象作为键名(null
除外),不接受其他类型的值作为键名。
其次,WeakMap
的键名所指向的对象,不计入垃圾回收机制。
// WeakMap 可以使用 set 方法添加成员 const wm1 = new WeakMap(); const key = {foo: 1}; wm1.set(key, 2); wm1.get(key) // 2 // WeakMap 也可以接受一个数组, // 作为构造函数的参数 const k1 = [1, 2, 3]; const k2 = [4, 5, 6]; const wm2 = new WeakMap([[k1, ‘foo‘], [k2, ‘bar‘]]); wm2.get(k2) // "bar"
WeakMap 的语法
WeakMap 与 Map 在 API 上的区别主要是两个,
一是没有遍历操作(即没有keys()
、values()
和entries()
方法),也没有size
属性。
二是无法清空,即不支持clear
方法。因此,WeakMap
只有四个方法可用:get()
、set()
、has()
、delete()
。
以上是关于es6之数据结构 set,WeakSet,mapWeakMap的主要内容,如果未能解决你的问题,请参考以下文章
ES6:数据结构Set和Map&WeakSet和WeakMap