2017-10-10 39 views
0

根據MDN,Map對象的size屬性應表示Map對象所具有的條目數。但是,如果我創建一個空的Map並使用括號符號(不確定這是什麼正式名稱)來添加鍵/值對,則size屬性不會更新。但是,如果我使用Map.set(key, value)函數,則屬性會更新。爲什麼是這樣?爲什麼當使用括號表示法添加鍵/值對時,Map size屬性不會更新?

實施例:

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

運行在這之後,返回ex.size1

回答

4

因爲向地圖對象添加屬性與向地圖添加元素不同(反之亦然)。嘗試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中的任何對象,但這並不意味着物體正在做與他們任何事情。

最容易混淆的情況可能是數組。只有數字在02^32之間的屬性才被視爲數組的「元素」。所以,當我做

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

然後arr.length仍然會0

1

由於ex['key1'] = 'value1';只是增加了一個新的屬性key1到對象ex(即恰好是Map類型)。

它不影響實際地圖的內容。

相關問題