根据 MDN,对象的size
属性Map
应该表示Map
对象拥有的条目数。但是,如果我创建一个空Map
并使用方括号表示法(不确定它的正式名称是什么)来添加键/值对,size
则不会更新该属性。但是,如果我使用该Map.set(key, value)
功能,则属性会更新。为什么是这样?
例子:
var ex = new Map();
ex['key1'] = 'value1';
ex.set('key2', 'value2');
运行后,ex.size
返回1
.
根据 MDN,对象的size
属性Map
应该表示Map
对象拥有的条目数。但是,如果我创建一个空Map
并使用方括号表示法(不确定它的正式名称是什么)来添加键/值对,size
则不会更新该属性。但是,如果我使用该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;
}
}
向类的实例添加属性不会影响this._items
,这是存储映射条目的位置。
您可以将任意属性添加到 JavaScript 中的基本上任何对象,但这并不意味着该对象正在使用它们做任何事情。
最令人困惑的情况可能是数组。只有数值介于两者之间的属性才被0
视为2^32
数组的“元素”。所以当我这样做的时候
var arr = [];
arr.foo = 42;
那么arr.length
仍然会0
。
因为刚刚向对象ex['key1'] = 'value1';
添加了一个新属性(恰好是 type )。key1
ex
Map
它不影响实际地图的内容。