| set 数据结构
ES6提供了新的数据结构Set,类似于数组,但成员值是唯一的,没有重复的值
Set本身是一个构造函数(要 new),用来生成Set数据结构
Set 对象允许你储存任何类型的唯一值,无论是原始值或者是对象引用。
const s = new Set();
可以接受一个数组作为参数,进行初始化
const s = new Set([1,2,3,4,4,3])
console.log([...s]) // [1,2,3,4]
实例方法api
- add(value): 添加某个值,返回 Set数据结构本身
- delete(value): 删除某个值,返回Boolean,删除成功与否
- has(value): 返回一个Boolean,是成员与否
- clear(): 清除所有成员,没有 return
const s1 = new Set(["a","b","c","d"]);
s1.add("f");//添加f
s1.delete("a");//删除a
console.log(s1.has("b"));//是否含有b,返回布尔值
s1.clear();//全部清除
const ary = [...s1];
console.log(ary);
set遍历
遍历方法(遍历顺序为插入顺序)
- keys():返回一个包含集合中所有
键的遍历器对象。 - values():返回一个包含集合中所有
值遍历器对象。 - entries():返回一个包含Set对象中所有元素得
键值对遍历器对象。 - forEach(callbackFn, thisArg):用于对集合成员执行callbackFn操作,如果提供了 thisArg 参数,回调中的this会是这个参数,没有返回值。
注:遍历器对象可以用for...of循环进行遍历
const s1 = new Set(["a","b"]);
// 对键名的遍历
for (let index of s1.keys()) {
console.log(index);
}
// a
// b
// 对键值的遍历
for (let elem of s1.values()) {
console.log(elem);
}
// a
// b
// 对键值对的遍历
for (let [index, elem] of s1.entries()) {
console.log(index, elem);
}
// "a" "a"
// "b" "b"
s1.forEach(value => console.log(value))
//a b
set总结
- 类似数组,值不重复
- 可存储任何类型
- 值不会进行类型转换,5和“5”是不同的
- 两个NaN也是重复的
- NaN和undefined都可以被存
| WeakSet数据结构
WeakSet 对象允许你将弱引用对象储存在一个集合中
实例方法api
- add(value): 添加某个值,返回 Set数据结构本身
- delete(value): 删除某个值,返回Boolean,删除成功与否
- has(value): 返回一个Boolean,是成员与否
WeakSet与Set区别
- WeakSet只能存储对象引用
- WeakSet存储弱引用,会被垃圾回收机制回收,保存dom节点不错
- 不想数据管理用WeakSet
- 没有size属性,不能遍历
| Map
Map对象保存键值对
Map本身是一个构造函数(要 new),用来生成Map数据结构
Map对象允许你储存任何类型的作为一个键或一个值
const m = new Map();
可以接受一个数组作为参数,进行初始化
const map = new Map([['key1','value1'],['key2','value2']])
console.log(map) // {'key1' => 'value1', 'key2' => 'value2'}
// 把对象做为key
const myKey = {dec:'本对象做为map键'};
map.set(myKey, 'myKey的键值'); // {'key1' => 'value1', 'key2' => 'value2', {…} => 'myKey的键值'}
map.get(myKey); // 'myKey的键值'
实例方法api
- set(key, value):添加数据,返回总的map
- get(key): 查找数据,返回当前键值
- has(key): 判断操作与否,返回Boolean,存在与否
- delete(key): 删除对应key,返回Boolean,成功与否
- clear(): 清空map,没有返回值
const map = new Map([['key1','value1'],['key2','value2']]);
map.set('myKey', 'myKey的键值'); // {'key1' => 'value1', 'key2' => 'value2', 'mykey' => 'myKey的键值'}
map.get('myKey'); // 'myKey的键值'
map.has('myKey'); // true
map.delete('myKey'); // true
map.clear(); // undefined
Map遍历
遍历方法(遍历顺序为插入顺序)
- keys():返回一个包含map中所有
键的遍历器对象。 - values():返回一个包含map中所有
值遍历器对象。 - entries():返回一个包含map中所有元素得
键值对遍历器对象。 - forEach(callbackFn, thisArg):用于对集合成员执行callbackFn操作,如果提供了 thisArg 参数,回调中的this会是这个参数,没有返回值。
const map = new Map([['key1','value1'],['key2','value2'],['myKey','myKey的键值']]);
for (let index of map.keys()) {
console.log(index);
}
// key1
// key2
// myKey
for (let value of map.values()) {
console.log(value);
}
// value1
// value2
// myKey的键值
for (let value of map.values()) {
console.log(value);
}
// value1
// value2
// myKey的键值
for (let [index, elem] of map.entries()) {
console.log(index, elem);
}
// key1 value1
// key2 value2
// myKey myKey的键值
map.forEach(value => console.log(value))
// value1
// value2
// myKey的键值
Map总结
- 支持的所有数据类型做为键
- 本质上是键值对的集合,类似集合
- 两个NaN也是重复的
- NaN和undefined都可以被存
| WeakMap
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,如果引用的对象被回收之后,该键会失效 WeakMap 的 key 是不可枚举的。
方法:
- has(key):判断是否有 key 关联对象。
- get(key):返回key关联对象(没有则则返回 undefined)。
- set(key):设置一组key关联对象。
- delete(key):移除 key 的关联对象。
WeakMap与Map区别
- 键名是弱引用
- 只接受对象作为键名(null除外)
- 不能遍历
| Map和Object的区别
- Object的key 必须是简单数据类型(整数、字符串、symbol),map的key可以是任何类型
- Map元素插入顺序是FIFO,object没有
- Map继承Object
- Map在存储大量元素的时候性能表现更好
- 写入删除密集的情况应该使用 Map
| Map和Set的区别
- Set以
[value, value]的形式储存元素,Map以[key,value]的形式储存元素 - map的值不作为键,键和值是分开的
| 参考
# ES6教程-阮一峰
# 面试题---Set和Map的区别;Map和Object 的区别
# 彻底弄懂ES6中的Map和Set