Set (集合)
ES6提供了一种新的数据结构Set,Set类似数组,但值唯一,本身为构造函数,用来生成Set数据结构,可以容纳任何数据类型的任何值
[value, value]形式
- 创建Set
let set = new Set([1, 2, 2, 3])
console.log(set);
//Set(3) { 1, 2, 3 }
Set可以接受一个数组作为参数,用来初始化
- Set实例的属性和方法
属性:
Set.prototype.constructor
构造函数,默认为 Set函数
Set.prototype.size
返回Set实例成员的总数
方法:
分为操作方法和遍历方法
1.操作方法
add()
向 Set 添加新元素,返回 Set 结构本身。
clear()
清除所有成员,没有返回值
delete()
删除某个值,返回一个布尔值,表示删除是否成功。
has()
返回一个布尔值,表示该值是否为Set的成员
let set = new Set(),
a = NaN,
b = NaN,
c = 1,
d = '1'
set.add(a).add(b).add(c).add(d)
console.log(set); //Set(3) { NaN, 1, '1' }
向Set加入值时,不会发生类型转换,1和 '1'是两个不同的值,类似于精确相等运算符,但是认为NaN等于自身
2.遍历方法
keys()
返回 Set 对象中值的数组。
values()
与 keys() 相同。
entries()
返回 Set 对象中值的数组。
forEach()
为每个元素调用回调。
let set = new Set([1, 2, 2, 3])
console.log(set.keys());
console.log(set.values());
/*
[Set Iterator] { 1, 2, 3 }
[Set Iterator] { 1, 2, 3 }
*/
Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
for (let key of set.keys()) {
console.log(key);
}
1
2
3
let set = new Set([1, 2, 2, 3])
console.log(set.entries());
//[Set Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ] }
entries方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等
for (let item of set.entries()) {
console.log(item[0]);
}
1
2
3
let set = new Set([1, 2, 2, 3])
set.forEach(value => console.log(value * 10))
/*
10
20
30
*/
Map(字典)
JS中的对象(Object),本质上是键值对的集合,但传统上只能用字符串作为键,Map数据结构类似于对象,但键的内容不拘束于字符串,任何类型的值(包括对象)都可当作键
[key, value]形式
- 基本的 Map() 方法
set()
为 Map 对象中的键设置值。
get()
获取 Map 对象中键的值。
entries()
返回 Map 对象中键/值对的数组
keys()
返回 Map 对象中键的数组。
values()
返回 Map 对象中值的数组。 - 创建Map对象
var map = new Map()
var obj = {name : 'harry'}
let a = map.set(obj, 'potter') //将obj作为map的键,并为其设置键值
let b = map.get(obj)
console.log(a); //Map(1) { { name: 'harry' } => 'potter' }
console.log(b); //potter
var arrObj = [
['name' ,'harry'],
['age' ,18],
['hobby' ,'magic']
]
var map = new Map(arrObj)
console.log(map); //Map(3) { 'name' => 'harry', 'age' => 18, 'hobby' => 'magic' }
Map构造函数还可接受一个数组作为参数,数组成员为一个个键值对的数组成员
console.log(map.keys()); //[Map Iterator] { 'name', 'age', 'hobby' }
console.log(map.values()); //[Map Iterator] { 'harry', 18, 'magic' }
console.log(map.entries());
/*
[Map Entries] {
[ 'name', 'harry' ],
[ 'age', 18 ],
[ 'hobby', 'magic' ]
}
*/
for (let key of map.keys()) {
console.log(key);
}
// name
// age
// hobby
for (let item of map.entries()) {
console.log(item[0]);
}
// name
// age
// hobby
- Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键(引用数据类型)
var map = new Map()
var arr = [1]
//键的内存地址一样
let a = map.set(arr, 'one')
let b = map.get(arr)
console.log(a); //Map(1) { [ 1 ] => 'one' }
console.log(b); //one
var map = new Map()
//键的内存地址不同,即使内容相同
let a = map.set([1], 'one')
let b = map.get([1])
console.log(a); //Map(1) { [ 1 ] => 'one' }
console.log(b); //undefined
简单数据类型(Number, String, Boolean)只要严格相等,Map将其视为一个键
- 其他Map方法
clear()
删除 Map 中的所有元素。
delete()
删除由键指定的元素。
has()
如果键存在,则返回 true。
forEach()
为每个键/值对调用回调。
var arrObj = [
['name' ,'harry'],
['age' ,18],
['hobby' ,'magic']
]
var map = new Map(arrObj)
console.log(map.has('age')); //true
console.log(map.has('height')); //false
map.delete('name')
console.log(map); //Map(2) { 'age' => 18, 'hobby' => 'magic' }
map.clear()
console.log(map); //Map(0) {}
map.forEach(callback, this)
forEach方法可以接受两个参数,第二个参数可为其指定this的指向
Set 和Map的区别
- Map是键值对,Set是值的集合,键和值可以为任何值
- Map可以通过get方法获取值,Set不行,因为Set只有值
- 都能够通过迭代器进行for ... of 遍历
- Set的值唯一,可以用来做数组去重,Map没有格式限制,可以做数据存储
WeakSet和WeakMap
WeakSet
WeakSet和Set类似,但其成员只能为对象,不能是其他类型的值,WeakSet中的对象都是弱引用,只存储引用,不存储值,垃圾回收机制不考虑WeakSet对该对象的引用,当没有其他对象引用该对象时,垃圾回收机制会自动回收该对象占用的内存,不考虑该对象还存在于 WeakSet 之中,基于此,WeakSet无法遍历,因为我们无法确认其内部成员是否还存在,有可能已被垃圾回收机制回收
- 语法
WeakSet 是一个构造函数,可以使用new命令,创建 WeakSet 数据结构
可接受一个数组或类数组对象作为参数
const a = [[1, 2], [3, 4]]
const ws = new WeakSet(a)
console.log(ws);
WeakSet结构有三个方法:
add()
向 WeakSet 实例添加一个新成员。delete()
清除 WeakSet 实例的指定成员has()
返回一个布尔值,表示某个值是否在 WeakSet 实例之中三个方法与Set同名方法类似
WeakMap
WeakMap结构与Map结构类似,也是用于生成键值对的集合
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
WeakMap的键名所指向的对象,不计入垃圾回收机制
键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的。与WeakSet一样,无法遍历
const obj = { 'name' : 'harry'}
const wm = new WeakMap()
wm.set(obj, 'potter')
console.log(wm);
WeakMap的方法
delete()
get()
has()
set()
用法与Map的同名方法类似