提醒:本文发布于 4 年前 ,文中所描述的信息可能已发生改变,请谨慎使用。
let m = new Map()
let key = {a:1}
m.set(key, true)
m.has(key) // true
m.has({a:1}) // false

虽然 Map 可以用任意类型做 Key 了。
但是 Key 的相等判断用的是 ===,导致用 Object 做 key 基本是废的。见 ecma262 7.2.10 SameValueZero(x, y)

要你何用!

---------------- 更新 ----------------------

思路被局限了,key 的范围被自己局限在可以通过JSON.parse获得的对象上。

更合理的 Map 的使用方式是管理那些实例化的对象,理由如下:

  1. 实例化的对象必然会在某个地方被引用,故不需要一个额外的管理 Key 的空间
  2. 库类可以通过 Map 建立实例和其他数据的映射关系,从实例对象剥离部分属性或者行程私有属性。

举个业务例子,例如给页面的 DOM 元素绑定 click 事件

let clickMap = new Map()
let div = document.querySelector('div')
click(div, function() {
  // listerner
})

trigger(div)

function click(el, fn) {
  let listeners = clickMap.get(el)
  if(!listeners) {
    listeners = []
  }
  listeners.push(fn)
  clickMap.set(el, listeners)
}

function trigger(el) {
  let listeners = clickMap.get(el)
  if(!listeners) {
    listeners = []
  }
  listeners.forEach(fn => {
    fn()
  })
}