为什么当我使用括号表示法添加 key/value 对时地图大小 属性 没有更新?

Why doesn't the Map size property update when I add a key/value pair using bracket notation?

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

示例:

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

在运行这个之后,ex.sizereturns1

因为向地图对象添加 属性 与向地图添加元素不同(反之亦然)。试试 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;
  }
}

将 属性 添加到 class 的实例不会影响 this._items,这是存储映射条目的地方。


您基本上可以向 JavaScript 中的任何对象添加任意属性,但这并不意味着该对象正在对它们执行任何操作。

最令人困惑的情况可能是数组。只有数值介于 02^32 之间的属性才被视为数组的 "elements"。所以当我这样做时

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

那么 arr.length 仍然是 0

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

不影响实际地图的内容。