为什么当我使用括号表示法添加 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.size
returns1
。
因为向地图对象添加 属性 与向地图添加元素不同(反之亦然)。试试 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 中的任何对象添加任意属性,但这并不意味着该对象正在对它们执行任何操作。
最令人困惑的情况可能是数组。只有数值介于 0
和 2^32
之间的属性才被视为数组的 "elements"。所以当我这样做时
var arr = [];
arr.foo = 42;
那么 arr.length
仍然是 0
。
因为ex['key1'] = 'value1';
刚刚向对象ex
添加了一个新的属性key1
(恰好是Map
类型)。
不影响实际地图的内容。
根据 MDN,Map
对象的 size
属性 应该表示 Map
对象拥有的条目数。但是,如果我创建一个空的 Map
并使用括号表示法(不确定它的正式名称是什么)来添加 key/value 对,则 size
属性 是没有更新。但是,如果我使用 Map.set(key, value)
函数,则会更新 属性。这是为什么?
示例:
var ex = new Map();
ex['key1'] = 'value1';
ex.set('key2', 'value2');
在运行这个之后,ex.size
returns1
。
因为向地图对象添加 属性 与向地图添加元素不同(反之亦然)。试试 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 中的任何对象添加任意属性,但这并不意味着该对象正在对它们执行任何操作。
最令人困惑的情况可能是数组。只有数值介于 0
和 2^32
之间的属性才被视为数组的 "elements"。所以当我这样做时
var arr = [];
arr.foo = 42;
那么 arr.length
仍然是 0
。
因为ex['key1'] = 'value1';
刚刚向对象ex
添加了一个新的属性key1
(恰好是Map
类型)。
不影响实际地图的内容。