haizlin / fe-interview

前端面试每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天进步一点!每天早上5点纯手工发布面试题(死磕自己,愉悦大家),6000+道前端面试题全面覆盖,HTML/CSS/JavaScript/Vue/React/Nodejs/TypeScript/ECMAScritpt/Webpack/Jquery/小程序/软技能……
http://www.h-camel.com
MIT License
25.28k stars 3.25k forks source link

[ECMAScript] 说说set和map有什么区别? #2080

Open haizhilin2013 opened 4 years ago

haizhilin2013 commented 4 years ago

说说set和map有什么区别?

我也要出题

an2544883599 commented 3 years ago

set对象类似于数组,并且值是唯一的。 map是键值对集合,里面的key不仅仅是字符串 还包括对象。

hyj443 commented 2 years ago

set是值的集合,有序的,按照插入的顺序可以迭代它的元素,set里的元素是唯一的

map是键值对的集合,有序的,按照键值对插入的顺序,任何值都可以作为key或value

yuan-xb commented 1 year ago

Map Map是一组键值对的结构,具有极快的查找速度。 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Array: var names = ['Michael', 'Bob', 'Tracy']; var scores = [95, 75, 85]; 给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,Array越长,耗时越长。 如果用Map实现,只需要一个“名字”-“成绩”的对照表,直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。用JavaScript写一个Map如下: var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); m.get('Michael'); // 95 初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法: var m = new Map(); // 空Map m.set('Adam', 67); // 添加新的key-value m.set('Bob', 59); m.has('Adam'); // 是否存在key 'Adam': true m.get('Adam'); // 67 m.delete('Adam'); // 删除key 'Adam' m.get('Adam'); // undefined 由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉: var m = new Map(); m.set('Adam', 67); m.set('Adam', 88); m.get('Adam'); // 88 Set Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。 要创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set: var s1 = new Set(); // 空Set var s2 = new Set([1, 2, 3]); // 含1, 2, 3 重复元素在Set中自动被过滤: var s = new Set([1, 2, 3, 3, '3']); s; // Set {1, 2, 3, "3"} 注意数字3和字符串'3'是不同的元素。 通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果: s.add(4); s; // Set {1, 2, 3, 4} s.add(4); s; // 仍然是 Set {1, 2, 3, 4} 通过delete(key)方法可以删除元素: var s = new Set([1, 2, 3]); s; // Set {1, 2, 3} s.delete(3); s; // Set {1, 2}

Cai-zhiji commented 1 year ago

Set 和 Map 是两种不同的数据结构,在 JavaScript 中用于存储和操作数据,它们有以下区别:

存储的数据类型:

Set 存储的是唯一的值,每个值只能出现一次。它不允许重复的元素。 Map 存储的是键值对(key-value pairs),其中键和值可以是任意类型的数据。键是唯一的,每个键只能出现一次,但值可以重复。

存储结构:

Set 使用类似数组的结构来存储唯一的值。它的主要目的是快速查找和判断值是否存在。 Map 使用键值对的结构来存储数据。它通过键来查找和访问对应的值。

迭代顺序:

Set 的迭代顺序是插入顺序。当使用迭代器遍历 Set 时,它按照插入的顺序返回元素。 Map 的迭代顺序是键的插入顺序。当使用迭代器遍历 Map 时,它按照键的插入顺序返回键值对。

方法和属性:

Set 提供了添加、删除、判断元素是否存在等操作的方法和属性,如 add()、delete()、has()、size 等。 Map 提供了设置键值对、获取值、判断键是否存在等操作的方法和属性,如 set()、get()、has()、size 等。

// 使用 Set 存储唯一的值
const uniqueSet = new Set();
uniqueSet.add(1);
uniqueSet.add(2);
uniqueSet.add(3);
uniqueSet.add(2); // 重复的值不会被添加

console.log(uniqueSet.size); // 输出 3
console.log(uniqueSet.has(2)); // 输出 true

// 使用 Map 存储键值对
const userMap = new Map();
userMap.set('name', 'Alice');
userMap.set('age', 25);
userMap.set('name', 'Bob'); // 同一个键可以被重复设置

console.log(userMap.size); // 输出 2
console.log(userMap.get('name')); // 输出 'Bob'
console.log(userMap.has('age')); // 输出 true