Object 和 Map 的区别


Object

字面量形式

Object 对象可以通过 {} 字面量来创建,但是用字面量进行创建的Object对象会附带 Object 原型的方法,比如 hasOwnPropertyOf 等等,如果用这种对象来代替 Map 的话,有可能会发生冲突。

此外,Object 对象只能以 StringSymbol 作为 key,如果你尝试将数组设为它的 key,那么它会调用数组的 toLocaleString 方法将其转化为字符串,再作为 key。

使用 Object.create(null)

要避免上面提到的第一个问题,我们可以使用 Object.create(null) 来创建一个空对象,这样相比于用字面量创建的对象更适合作为 Map,因为它不会继承 Object 原型上的方法,但是这也有可能成为其缺陷。

Map

可以通过 const map = new Map() 来创造一个 Map 对象,并使用其自带的 操作方法 来操作表内容,这是与 Object 对象的第一个区别。

Map 对象的初始化是通过在构造函数中传入一个数组来实现的:

const map = new Map([
    ['key1', 'value1'],
    ['key2', 'value2']
]);

这与 Object 也有区别。

最后,Map 允许使用任何类型的值作为 key,但是需要注意的是不应该随意使用引用类型作为 key,不然可能会导致内存泄漏。这种情况下应该使用 WeakMap API 来代替 Map。

总结

Object 与 Map 都可以被当作哈希表使用,但是 ES6 后,我们可以选择 Map 来创建更加纯粹的哈希表。