繁体   English   中英

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

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

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

例:

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

运行此ex.size后, ex.size返回1

因为向地图对象添加属性与向地图对象添加元素不同(反之亦然)。 尝试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中的任何对象添加任意属性,但这并不意味着该对象对它们执行任何操作。

最令人困惑的情况可能是数组。 只有数值在02^32之间的属性才被视为数组的“元素”。 所以当我这样做

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

然后arr.length仍为0

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM