Javascript 为什么';当我使用括号表示法添加键/值对时,Map size属性是否会更新?

Javascript 为什么';当我使用括号表示法添加键/值对时,Map size属性是否会更新?,javascript,ecmascript-6,es6-map,Javascript,Ecmascript 6,Es6 Map,根据MDN,Map对象的属性应该表示Map对象具有的条目数。但是,如果我创建一个空的映射,并使用括号表示法(不确定其正式名称)添加一个键/值对,则大小属性不会更新。但是,如果我使用Map.set(key,value)函数,那么属性就会更新。为什么会这样 例如: var ex = new Map(); ex['key1'] = 'value1'; ex.set('key2', 'value2'); 运行此操作后,ex.size返回1 因为向贴图对象添加属性与向贴图添加元素不同(反之亦然)。试试e

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

例如:

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

运行此操作后,
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;
  }
}
将属性添加到类的实例不会影响此。_items,它是存储映射项的位置


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

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

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

然后
arr.length
仍将是
0

,因为向贴图对象添加属性与向贴图添加元素不同(反之亦然)。试试
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;
  }
}
将属性添加到类的实例不会影响此。_items,它是存储映射项的位置


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

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

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

然后
arr.length
仍然是
0

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


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

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

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