面试官:Map和Set的区别,Map和Object的区别?

2,086 阅读5分钟

| 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

  1. add(value): 添加某个值,返回 Set数据结构本身
  2. delete(value): 删除某个值,返回Boolean,删除成功与否
  3. has(value): 返回一个Boolean,是成员与否
  4. 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遍历

遍历方法(遍历顺序为插入顺序)

  1. keys():返回一个包含集合中所有键的遍历器对象
  2. values():返回一个包含集合中所有值遍历器对象
  3. entries():返回一个包含Set对象中所有元素得键值对遍历器对象
  4. 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总结

  1. 类似数组,值不重复
  2. 可存储任何类型
  3. 值不会进行类型转换,5和“5”是不同的
  4. 两个NaN也是重复的
  5. NaN和undefined都可以被存

| WeakSet数据结构

WeakSet 对象允许你将弱引用对象储存在一个集合中

实例方法api

  1. add(value): 添加某个值,返回 Set数据结构本身
  2. delete(value): 删除某个值,返回Boolean,删除成功与否
  3. has(value): 返回一个Boolean,是成员与否

WeakSet与Set区别

  1. WeakSet只能存储对象引用
  2. WeakSet存储弱引用,会被垃圾回收机制回收,保存dom节点不错
  3. 不想数据管理用WeakSet
  4. 没有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

  1. set(key, value):添加数据,返回总的map
  2. get(key): 查找数据,返回当前键值
  3. has(key): 判断操作与否,返回Boolean,存在与否
  4. delete(key): 删除对应key,返回Boolean,成功与否
  5. 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遍历

遍历方法(遍历顺序为插入顺序)

  1. keys():返回一个包含map中所有键的遍历器对象
  2. values():返回一个包含map中所有值遍历器对象
  3. entries():返回一个包含map中所有元素得键值对遍历器对象
  4. 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总结

  1. 支持的所有数据类型做为键
  2. 本质上是键值对的集合,类似集合
  3. 两个NaN也是重复的
  4. NaN和undefined都可以被存

| WeakMap

WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意

注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用

WeakMap 中,每个键对自己所引用对象的引用都是弱引用,如果引用的对象被回收之后,该键会失效 WeakMap 的 key 是不可枚举的

方法:

  1. has(key):判断是否有 key 关联对象。
  2. get(key):返回key关联对象(没有则则返回 undefined)。
  3. set(key):设置一组key关联对象。
  4. delete(key):移除 key 的关联对象。

WeakMap与Map区别

  1. 键名是弱引用
  2. 只接受对象作为键名(null除外)
  3. 不能遍历

| Map和Object的区别

  1. Object的key 必须是简单数据类型(整数、字符串、symbol),map的key可以是任何类型
  2. Map元素插入顺序是FIFO,object没有
  3. Map继承Object
  4. Map在存储大量元素的时候性能表现更好
  5. 写入删除密集的情况应该使用 Map

| Map和Set的区别

  1. Set以[value, value]的形式储存元素,Map以[key,value]的形式储存元素
  2. map的值不作为键,键和值是分开的

| 参考

# ES6教程-阮一峰
# 面试题---Set和Map的区别;Map和Object 的区别
# 彻底弄懂ES6中的Map和Set