[英]Why can't I assign a property to an object using bracket notation + a variable?
[英]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中的任何对象添加任意属性,但这并不意味着该对象对它们执行任何操作。
最令人困惑的情况可能是数组。 只有数值在0
到2^32
之间的属性才被视为数组的“元素”。 所以当我这样做
var arr = [];
arr.foo = 42;
然后arr.length
仍为0
。
因为ex['key1'] = 'value1';
刚刚向对象ex
添加了一个新的属性key1
(碰巧是Map
类型)。
它不会影响实际地图的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.