Javascript 为什么';当我使用括号表示法添加键/值对时,Map size属性是否会更新?
根据MDN,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
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
)
它不会影响实际地图的内容