首頁 > web前端 > 前端問答 > es6 map是引用型別嗎

es6 map是引用型別嗎

青灯夜游
發布: 2023-01-11 16:59:00
原創
1596 人瀏覽過

map是引用類型;map(集合)是es6新增的一種引用資料類型,表示資料的映射關係。 map集合資料類型中資料是以“鍵/值”的方式儲存的,可以使用物件的屬性作為鍵,使用屬性來引用值;map可以使用new來創建,範例“const myMap = new Map();” 。

es6 map是引用型別嗎

本教學操作環境:windows7系統、ECMAScript 6版、Dell G3電腦。

map是引用類型。

es6 map

在ES6之前,在JavaScript中實作'鍵'=>'值',也就是我們常說的鍵值對,是用Object來完成的。但這種實作方式在特殊場景下的有問題的,ES6又出了一個為Map的新集合類型,為這門語言帶來正真的鍵值對儲存機制。

map(集合)是es6新增的一種引用資料類型,表示資料的映射關係;map集合資料類型中資料是以「鍵/值」的方式儲存的,可以使用物件的屬性作為鍵,使用屬性來引用值。

1-1 建立Map

#使用new關鍵字來實例一個map

let m = new Map();

console.log(m);
// Map(0) {}
登入後複製

創建時初始化:
傳入一個二維數組參數(可迭代對象,內部以數組的方式傳入鍵值)
每個子數組,第一個元素是map對應的key, 第二個元素是map對應的value

let m = new Map([[{}, 222], [{}, '123']]);

console.log(m);
// Map(2) { {} => 222, {} => '123' }
登入後複製

1-2 Map Api

1-2-1 新增映射元素

#透過set()方法加,傳入兩個參數,第一個傳入映射的鍵,第二個傳入映射的值。傳回的是該映射集合(意味著可以鍊式添加)

let m = new Map();

m.set('prop', '值');

console.log(m);
// Map(1) { 'prop' => '值' }
登入後複製

鍊式添加鍵值

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

console.log(m);
// Map(3) { 'prop' => '值', 'prop2' => false, 'num' => { id: 13 } }
登入後複製

1-2-2 映射集合長度

使用size屬性可以取得到目前集合元素數量

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

console.log(m.size);
登入後複製

1-2-3 取得元素

透過get()方法取得到元素,傳入取得目標的key

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

console.log(m.get('prop2'));
// false
登入後複製

1-2-4 刪除元素

透過delete()方法刪除映射集合中的某個元素,傳回刪除成功或失敗的布林值

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

m.delete('prop2');
// true

console.log(m.get('prop2'), m.size);
// undefined 2
登入後複製

1-2-5 偵測元素是否存在

使用has()方法偵測目標元素是否存在,傳回偵測結果的布林值

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

m.delete('prop2');
// true

console.log(m.has('prop2'), m.has('num'));
// false  true
登入後複製

1-2-6 清除元素方法

使用clear()方法可以清除所有的元素, 傳回清除成功的布林值

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

m.clear();
// true

console.log(m);
// Map(0) {}
登入後複製

1-3 順序與迭代

map可以根據插入順序迭代元素
映射實例會提供(iterator).能夠以插入的順序產生[key, value]形式的數組,可以透過entries ()方法(或提供的Symbol.iterator)迭代器介面遍歷。

let m = new Map();

m.set('prop', '值').set('prop2', false).set('num', {id: 13});

console.log(m.entries === m[Symbol.iterator]);// true

for(let k1 of m.entries()){
    console.log(k1);
    // [ 'prop', '值' ]
    // [ 'prop2', false ]
    // [ 'num', { id: 13 } ]
    // 遍历的属性即对应映射元素的键值对数组
}

for(let k2 of m.keys()){
    console.log(k2);
    // prop
    // prop2
    // num
    // 遍历的属性对应映射元素的键
}

for(let k3 of m.values()){
    console.log(k3);
    // 值
    // false
    // { id: 13 }
    // 遍历的属性对应映射元素的值
}

for(let k4 of m[Symbol.iterator]()){
    console.log(k4);
    // [ 'prop', '值' ]
    // [ 'prop2', false ]
    // [ 'num', { id: 13 } ]
    // 遍历的属性即对应映射元素的键值对数组
}
登入後複製

1-4 與Object對比

  • #記憶體佔用

    瀏覽器的差異會導致兩種儲存方式佔用的記憶體佔用所不同,不過在給定記憶體大小的情況下,map比Object多儲存大約50%的鍵值對

  • 插入效能

    插入速度上面map 和Object效能大致相同, 但如果程式碼涉及大量的插入,建議使用map

  • 找出速度

    #差異較小,只包含少量鍵值對的情況下Object更好

  • 刪除性能

    #Object 的delete()性能較差,而map的刪除delete()效能好,如果資料涉及大量的刪除操作,建議使用map

【相關推薦:javascript影片教學程式設計影片

以上是es6 map是引用型別嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板