共同点
三者都是对象
Map
Map 指的是键值对的集合。任何值都可以作为一个键或一个值。Map构造函数可以接受一个数组或者Map作为参数。
let a = new Map([['name': 'kobe'], ['age': '24'], ['id': 8]]) // 用数组作为构造函数的参数
let list = Array.from(a) // 可以使用 Array.from 方法,把 Map 转成数组
Map 用法
const a = new Map() // 创建一个 Map 对象
a.set(0, 'abcde') // 往 Map 里面增加一个键值对 {0 => 'abcde}, 已存在 0 则会修改
a.get(0) // 根据键 获取对应的 值 'abcde'
a.has(key) // 判断 Map 对象是否有 key 所对应的值,有则返回 true,没有返回 false
a.delete(key) // 删除 Map 对应的数据
a.clear() // 删除 Map 中所有的元素
a.size() // 返回对象中所包含的键值对个数
let b = new Map(a) // 克隆一个 Map,其中 a !== b
let c = new Map([...a, ...b]) // Map 的合并
for(let [key, value] of a) {} // for...of 遍历 Map
a.forEach((value, key) => {}) // forEach 遍历 Map
Set
Set 允许存储任何类型的值,无论是原始值或者是对象引用。它类似于数组,但是成员的值都是唯一的,没有重复的值,Set 构造函数可以接受一个数组作为参数,用来初始化。(可以用来去重、交集、并集、差集)
用法
const a = new Set(['a', 'b', 1, 1]) // 创建一个 Set 对象 a => {'a', 'b', 1}
// Set 构造函数传入字符串 会被拆分成单个字母的数组
const b = new Set('abcde') // => Set(5) {'a', 'b', 'c', 'd', 'e'}
const listB = [...b] // set对象 转换成数组
a.add('c').add({'a': 1}) // add(value) 添加一个值,返回 Set 解构本身(可以链式调用)
// a => {'a', 'b', 1, 'c', {'a': 1} }
a.size() // =>5 返回 Set 实例的成员总数
a.delete(value) // 删除某个值,成功返回 true,失败返回 false
a.has(value) // 返回一个布尔值,表示该值是否为 Set 成员
a.clear() // 清除所有成员,没有返回值
for(let item of b) {} // for...of 遍历 Set
b.forEach(([item]) => {}) // forEach 遍历 Set
Object
在 Object 中,key 必须是简单数据类型(整数、字符串、Symbol)
用法
// 创建一个新的实例
let obj = {}
let obj = new object()
let obj = Object.create(null)
obj.a = 123 或者 obj['a'] = 123 // 没有 a 属性 则增加一个 a,有则修改 a 的值
obj.a 或者 obj['a'] 可以访问到 obj 中 属性 a 的值
obj.a === undefined 或 'a' in obj // 可以判断 a 是不是在 obj 中
delete obj.a 或者 obj.a = undefined 可以删除某个属性,第二种效率更高(遍历还会存在 a = undefined)
Object.keys(obj).length // 用来计算 obj 的长度
Map 和 Object 的区别
Object 的键只能是简单数据类型(整数、字符串、Symbol),但是一个 Map 的键可以使任意值。
Map 中的键是有序的(FIFO 原则),二添加到对象中的键则不是
Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数用 Object.keys(obj).length 计算
Object 都有自己的原型,原型链上的键名哟可能和你自己对象上设置的键名产生冲突
Map 继承自 Object 对象
Map 和 Set 的区别
Map 是键值对,Set是值的集合(类似数组),它们的键和值都可以是任何值
Map 可以通过 get 方法获取值,但 Set 并不能,因为它只有值
Set 的值是唯一的,可以用来做数组去重,Map 没有格式限制,可以做数据存储
都能通过 for...of 和 forEach 遍历