使用括号表示法添加键/值对时,为什么Map大小属性不会更新?

Ian*_*Ian 1 javascript ecmascript-6 es6-map

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

例:

var ex = new Map();
ex['key1'] = 'value1';
ex.set('key2', 'value2');
Run Code Online (Sandbox Code Playgroud)

运行后,ex.size返回1.

Fel*_*ing 5

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

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


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

最令人困惑的情况可能是数组.只有数值介于0和之间的属性才被2^32视为数组的"元素".所以,当我这样做

var arr = [];
arr.foo = 42;
Run Code Online (Sandbox Code Playgroud)

然后arr.length仍然会0.