前两天电面问到了,支支吾吾只是答了个大概,深入了解一下。
Set
集合,本质是一个构造函数,类似与数组,但成员都是唯一的。
set实例的api
属性:
Set.prototype.constructor
:构造函数。Set.prototype.size
:返回Set
实例的成员总数。
操作方法:
Set.prototype.add(value)
:添加某个值,返回Set
结构本身。Set.prototype.delete(value)
:删除某个值,返回一个布尔值,表示删除是否成功。Set.prototype.has(value)
:返回一个布尔值,表示该值是否为Set
的成员。Set.prototype.clear()
:清除所有成员,没有返回值。
遍历方法(Set
中键名与键值相同):
Set.prototype.keys()
:返回键名的遍历器xSet.prototype.values()
:返回键值的遍历器Set.prototype.entries()
:返回键值对的遍历器Set.prototype.forEach()
:使用回调函数遍历每个成员
应用
- 去除数组重复成员
let arr=[1,2,1,3,4,2,4]
let unique=[...new Set(arr)] // [1,2,3,4]
- 数组深拷贝
// 数组浅拷贝
var a1=[1,2]
var a2=a1
a2[0]=2
a1 // [2,2]
// 深拷贝
var a3=[3,4]
var a4=[...a3]
- 并集(Union)、交集(Intersect)和差集(Difference)
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
- NaN在Set中相等
let set = new Set()
let a = NaN
let b = NaN
a==b // false
set.add(a)
set.add(b)
set.size // 1
WeakSet
特点
WeakSet的成员只能是对象,WeakSet的成员对象都是弱引用,不计入垃圾回收机制,其成员不适合引用,因为它随时会消失。由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历。
WeakMap的api
WeakSet.prototype.add(value)
:向WeakSet
实例添加一个新成员。WeakSet.prototype.delete(value)
:清除WeakSet
实例的指定成员。WeakSet.prototype.has(value)
:返回一个布尔值,表示某个值是否在WeakSet
实例之中。
Map
特点
不同于不同的对象,键的值不局限于字符串,可以以对象作为键值。是一种更完善的哈希结构,Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。如果 Map 的键是一个简单类型的值(数字、字符串、布尔值),则只要两个值严格相等,Map 将其视为一个键(除NaN)。
Map实例的api
size
Map.prototype.set(key, value)
Map.prototype.get(key)
Map.prototype.has(key)
Map.prototype.delete(key)
Map.prototype.clear()
WeakMap
特点
WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。键名弱引用,键值不是弱引用。