2

根据 MDN,对象的size属性Map应该表示Map对象拥有的条目数。但是,如果我创建一个空Map并使用方括号表示法(不确定它的正式名称是什么)来添加键/值对,size则不会更新该属性。但是,如果我使用该Map.set(key, value)功能,则属性会更新。为什么是这样?

例子:

var ex = new Map();
ex['key1'] = 'value1';
ex.set('key2', 'value2');

运行后,ex.size返回1.

4

2 回答 2

6

因为向地图对象添加属性与向地图添加元素不同(反之亦然)。尝试ex.get('key1')(和ex['key2'])。只Map#set向地图添加一个元素。如果您考虑这种糟糕且有限的实施,也许会变得更清楚Map

class Map {
  constructor() {
    this._items = {};
  }

  set(key, value) {
    this._items[key] = value;
  }

  get(key) {
    return this._items[key];
  }

  get size() {
    return Object.keys(this._items).length;
  }
}

向类的实例添加属性不会影响this._items,这是存储映射条目的位置。


您可以将任意属性添加到 JavaScript 中的基本上任何对象,但这并不意味着该对象正在使用它们做任何事情。

最令人困惑的情况可能是数组。只有数值介于两者之间的属性才被0视为2^32数组的“元素”。所以当我这样做的时候

var arr = [];
arr.foo = 42;

那么arr.length仍然会0

于 2017-10-10T17:34:01.247 回答
2

因为刚刚向对象ex['key1'] = 'value1';添加了一个新属性(恰好是 type )。key1exMap

它不影响实际地图的内容。

于 2017-10-10T17:34:08.143 回答