JavaScript 中 Set 和 Map 相关面试题合集

开始

最近复习ES6的知识,看自己以前在语雀做的一些总结,真的感觉每次看都有一种全新的理解,可能也代表自己对这门语言理解也达到了一定的深度了。本人目前24届双非普本,秋招至今 0 offer,真的颓了,工作还没找到,还是得逼自己学。

我打算建一个专栏,专门做一些面试题相关的合集,这样也能起到复习作用,加深理解,也可以分享给有需要的人。

这一篇写的是关于JavaScriptSetMap相关讲解,知识比较简单,不过建议提前复习下迭代器相关的知识。

Set和Map的基本使用

我们可以说Set是一种叫集合的数据结构,Map是一种叫字典的数据结构,它们也统一叫做哈希表,都可以用来存储不重复的值。同时SetMap都是可迭代对象

是可迭代对象,说明可以通过for...of来进行遍历。

SetMap所有的Api都在这啦。

简单说一下怎么遍历SetMap吧,最简单的方式就是使用for...of,当然也可以用forEachkeysvaluesentries。就只有这些Api

js 复制代码
const set = new Set([1, 4, 6, 3, 2]);

for (const item of set) {
  console.log(item);
  // 1
  // 4
  // 6
  // 3
  // 2
}

const map = new Map([
  ["a", 1],
  ["b", 2],
  ["a", 3],
]);

for (const [key, value] of map) {
  console.log(key, value);
  // a 1
  // b 2
  // c 3
}

Map 和 object 的区别?

  • 键的类型object 只能是 stringsymbol 类型,而 Map 可以是任意类型。

  • 键的遍历顺序Map 的键值对是有序 的(按插入顺序,for...of测试打印),object 的键的顺序,按以下排列,可以通过for...in测试打印顺序:

    1. 先是,数字键从小到大排

    2. 然后,字符串键插入顺序

    3. 最后,Symbol键按插入顺序排

  • 获取大小Map 可以通过 size 获取键值对的数量,而 object 不能

  • 迭代器Map可迭代对象 ,可以使用 for...of 遍历,object 不是可迭代对象,使用 for...in遍历

  • 性能 :在非常大数据集合 下,涉及到插入/删除 操作时,Map 的性能更佳。

Set 和 WeakSet 的区别?

WeakSet弱引用集合MDN

  • 没有 clear() 和 size
  • 不再是可迭代对象,不能使用 keys、values、entries、forEach
  • 只能存储对象值的集合
  • 弱引用 :对象在外部的引用 消失,在WeakSet中也会消失,被被当成垃圾回收掉

可以看一下MDNWeakSet只有这几个方法了,WeakMap同理。

Map 和 WeakMap 的区别?

WeakMap弱引用映射表。 MDN

  • 没有 clear() 和 size
  • 不再是可迭代对象,不能使用 keys、values、entries、forEach
  • 必须是对象 可以是任意类型
  • 弱引用 :对象在外部的引用 消失,在WeakSet中也会消失,被被当成垃圾回收掉

WeakSet 和 WeakMap 的应用场景?

我自己没怎么用过这两。WeakSetWeakMap最有用的特性就是弱引用了,大概了解的使用场景:

  • DOM 节点引用 :在 Web 开发中,WeakSet 可以用来存储对 DOM 节点的弱引用,当节点从 DOM 树中删除时,不会阻止节点被垃圾回收。
  • 处理深拷贝循环引用的问题。

有其他使用场景的可以在评论区告知下。

使用 Set 实现交集、并集、差集

实现思路:展开运算符、filter、has

js 复制代码
const a = new Set([1, 2, 3]);
const b = new Set([4, 3, 2]);

// 并集
const union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
const intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// (a 相对于 b 的)差集
const difference = new Set([...a].filter(x => !b.has(x)));

Map 和 object 怎么转换?

  • object -> Map:Object.formEntries(myMap)
  • Map -> object:Object.entries(myObject)
js 复制代码
const myMap = new Map([
  ['key1', 'value1'],
  ['key2', 'value2'],
]);

const myObject = Object.fromEntries(myMap);
console.log(myObject); // { key1: 'value1', key2: 'value2' }
js 复制代码
const myObject = {
  key1: 'value1',
  key2: 'value2',
};

const myMap = new Map(Object.entries(myObject));
console.log(myMap); // Map { 'key1' => 'value1', 'key2' => 'value2' }

Set 和 数组之间怎么转换?

  • Set -> Array:展开运算符([...set])、Array.from()
  • Array -> Set:new Set(arr),Set 还会做去重的操作。
js 复制代码
const set = new Set([1, 3, 4, 6]);

const arr1 = [...set];
const arr2 = Array.from(set);

console.log(arr1, arr2);
js 复制代码
const arr = [1, 4, 5, 2, 4, 1];

const set = new Set(arr);

console.log(set); //[1,4,5,2]

写完了,有问题可以在评论区讨论~~

相关推荐
yuki_uix几秒前
防抖(Debounce):从用户体验到手写实现
前端·javascript
q1cheng几秒前
(1)分组统计 + 筛选、(2)自连接去重和(3)子查询方式
面试
HelloReader1 分钟前
Flutter 进阶 UI搭建 iOS 风格通讯录应用(十一)
前端
张元清2 分钟前
每个 React 开发者都需要的 10 个浏览器 API Hooks
前端·javascript·面试
进击的尘埃4 分钟前
给 Claude Code 造个趁手的 MCP Tool Server,聊聊我踩的那些坑
javascript
HelloReader5 分钟前
Flutter ListenableBuilder让界面自动响应数据变化(十)
前端
yuki_uix5 分钟前
深拷贝:JavaScript 引用类型的完全复制之道
前端·javascript
默默学前端34 分钟前
JavaScript 中 call、apply、bind 的区别
开发语言·前端·javascript
星辰_mya35 分钟前
Fork/Join 框架与并行流:CPU 密集型的“分身术”
java·开发语言·面试
宁雨桥38 分钟前
前端设计模式面试题大全
前端·设计模式