map資料結構類似於物件,也是鍵值對的集合,但是「鍵」的範圍不限於字串,各種型別的值(包括物件)都可以當作鍵。例項:
//es5:
var obj = {},arr = ;
obj[arr] = 'array';
console.log(obj);//
//es6:
let map = new map(),obj = ;
map.set(obj,'array');
console.log(map);// => "array"}
map.get(obj);//"array"
map.has(obj);//true
map.delete(obj);//true
map.has(obj);//false
從上邊例項可以看出在es5的時候,物件的鍵值都是字串,如果不是字串會進行隱式轉換為字串,儲存的結果就不是最開始的初衷。map資料結構就是讓鍵值可以是各種型別的值。
map 作為建構函式, 可以接受乙個陣列作為引數。該陣列的成員是乙個個表示鍵值對的陣列。例項:
let map = new map([
['autnor', 'rattenking'],
['age', '26'],
['***','gentleman']
]);map.size // 3
map.has('autnor'); // true
map.get('autnor'); //
"rattenking"
map.has('age'); // true
map.get('age'); //
"26"
map.has('***'); // true
map.get('***'); //
"gentleman"
console.log(map);//
let arr = [
['autnor', 'rattenking'],
['age', '26'],
['***','gentleman']
]let map = new map();
arr.foreach(current=> map.set(current[0],current[1]));
console.log(map);//
1.任何具有 iterator 介面、且每個成員都是乙個雙元素的陣列的資料結構都可以當作map建構函式的引數。
let set = new set([['autnor', 'rattenking'],['age', '26']]);
let map = new map(set);
console.log(map);//
2.對同乙個鍵多次賦值,後面的值將覆蓋前面的值。
let
map=
newmap();
map.
set('autnor','rattenking');
map.
set('autnor','stone');
map.get('autnor');//"stone"
讀取乙個未知的鍵,則返回undefined。
let map = new map([['a',1]]);
map.get('a');//1
map.get('b');//undefined
4.只有對同乙個物件的引用,map 結構才將其視為同乙個鍵。
let map = new map();
map.set(['autnor'],'rattenking');
map.get(['autnor']);//undefined
5.同理可推:同樣的值的兩個例項,在 map 結構中被視為兩個鍵。
let map = new map();
let arr1 = ['autnor', 'rattenking'];
let arr2 = ['autnor', 'rattenking'];
map.set(arr1,'rattenking')
.set(arr2,'stone');
console.log(map);//
map.get(arr1);//
"rattenking"
map.get(arr2);//
"stone"
結論:map 的鍵實際上是跟記憶體位址繫結的,只要記憶體位址不一樣,就視為兩個鍵。這就解決了同名屬性碰撞(clash)的問題,我們擴充套件別人的庫的時候,如果使用物件作為鍵名,就不用擔心自己的屬性與原作者的屬性同名。6.nan雖然不嚴格相等,但是在map中會認為是同一鍵值。其他鍵值根據嚴格相等(===)來判斷是否為同一鍵值。
let
map=
newmap();
nan===
nan//false
map.
set(nan,1);
map.get(nan);//1-0
===0&&0
===+0&&
-0===+
0//true
map.
set(-
0,'num');
map.get(+
0);//'num'
undefined ===
null
//false
map.
set(undefined, undefined);
map.
set(null, null);
map.get(undefined);//undefined
map.get(null);//null
true
==='true'
//false
map.
set(true,'bool');
map.get('true');//undefined
size 屬性返回 map 結構的成員總數。
set 方法設定鍵名key對應的鍵值為value,然後返回整個 map 結構。
get 方法讀取key對應的鍵值,如果找不到key,返回undefined。
has 方法查詢某個鍵是否在當前 map 物件之中,返回乙個布林值。
delete 方法刪除某個鍵,返回乙個布林值。
clear 方法清除所有成員,沒有返回值。
keys():返回鍵名的遍歷器。
values():返回鍵值的遍歷器。
entries():返回所有成員的遍歷器。
foreach():遍歷 map 的所有成員。
總結:任何具有 iterator 介面、且每個成員都是乙個雙元素的陣列的資料結構都可以當作map建構函式的引數。—-map建構函式的引數對同乙個鍵多次賦值,後面的值將覆蓋前面的值。—-同名鍵值的賦值會覆蓋前邊的值讀取乙個未知的鍵,則返回undefined。—-獲取map中不存在的鍵值,返回undefined只有對同乙個物件的引用,map 結構才將其視為同乙個鍵。—-只有記憶體位址相同的引用,map 結構才將其視為同乙個鍵
map 結構除了nan是同一鍵值,其他值的鍵值都遵循嚴格相等運算子(===)。
我的部落格,歡迎交流!
我的csdn部落格,歡迎交流!
前端筆記專欄
前端筆記列表
遊戲列表
posted @
2017-12-14 13:29
newman·li 閱讀(
...)
編輯收藏
ES6之 Map資料結構
es6新增了 map資料結構,map物件儲存鍵值對,任何值 原始值或物件 都可以作為乙個鍵或乙個值。let map new map let obj map.set obj,myobject map.get obj myobject map.has obj true map.delete obj tr...
ES6 新增的Map資料結構
es6 新增的map資料結構 雖然網上很多講解 還是打算自己整理一下來加深印象 map可以接受陣列作為引數,陣列成員還是乙個陣列,其中有兩個元素,乙個表示鍵乙個表示值。const map2 new map name aissen age 12 map2 map2.size 2 map2.set ma...
ES6學習之set和map資料結構
基本用法 es6提供了新的資料結構set。它類似陣列,但是成員都是唯一的,不允許重複。其本身是乙個建構函式,用來生成set資料結構。const set new set 1,2,3,4,4 const sets new set document.queryselectorall div 複製 set函...