Map
//Object對象
{"name":"劉英","gender":1}
????ES5中的key鍵名的類型要求一定是字符串管钳,ES6 提供了Map結(jié)構(gòu)給我們使用钦铁,它跟Object對象很像,但是不同的是蹋嵌,它的key鍵名的類型不再局限于字符串類型了,它可以是各種類型的值葫隙;可以說栽烂,它比Object對象更加靈活了,當(dāng)然恋脚,也更加復(fù)雜了腺办。
Map的基本用法
let m = new Map();
let m = new Map([
["name","王大拿"],
["gender",1]
]);
console.log(m);
//打印結(jié)果:Map {"name" => "王大拿", "gender" => 1}
set( )方法
????set( )方法作用:給實(shí)例設(shè)置一對鍵值對,返回map實(shí)例糟描。
let m = new Map();
//set方法添加
//添加一個(gè)string類型的鍵名
m.set("name","王大拿");
//添加一個(gè)數(shù)字類型的鍵名
m.set(1,2);
console.log(m);
//打印結(jié)果:Map {"name" => "王大拿", 1 => 2}
????set方法的使用很簡單怀喉,只需要給方法傳入key和value作為鍵名和鍵值即可。注意:第三行代碼中船响,我們傳入的key是數(shù)字1躬拢,這就證明了,Map結(jié)構(gòu)確實(shí)可以存儲非字符串類型的鍵名见间,當(dāng)然你還可以設(shè)置更多其它類型的鍵名聊闯,比如:
//數(shù)組類型的鍵名
m.set([1],2);
//對象類型的鍵名
m.set({"name":"Zhangsan"},2);
//布爾類型的鍵名
m.set(true,2);
//Symbol類型的鍵名
m.set(Symbol('name'),2);
//null為鍵名
m.set(null,2);
//undefined為鍵名
m.set(undefined,2);
????使用set方法的時(shí)候有一點(diǎn)需要注意,如果你設(shè)置一個(gè)已經(jīng)存在的鍵名米诉,那么后面的鍵值會覆蓋前面的鍵值菱蔬。
let m = new Map();
m.set("name","王大拿");
console.log(m);
//結(jié)果:Map {"name" => "王大拿"}
//再次設(shè)置name的值
m.set("name","隔壁老王");
console.log(m);
//結(jié)果:Map {"name" => "隔壁老王"}
get( )方法
????get( )方法作用:獲取指定鍵名的鍵值,返回鍵值史侣。
let m = new Map([["name","劉英"]]);
m.get("name");//結(jié)果:劉英
m.get("gender");//結(jié)果:undefined
????get方法使用也很簡單拴泌,只需要指定鍵名即可。獲取存在對應(yīng)的鍵值惊橱,如果鍵值對存在蚪腐,就會返回鍵值;否則税朴,返回undefined削茁,這個(gè)也很好理解宙枷。
delete( )方法
????delete( )方法作用:刪除指定的鍵值對,刪除成功返回:true茧跋,否則返回:false慰丛。
let m = new Map();
m.set("name","劉英");
//結(jié)果:Map {"name" => "劉英"}
m.delete("name");//結(jié)果:true
m.delete("gender");//結(jié)果:false
clear( )方法
????跟Set結(jié)構(gòu)一樣,Map結(jié)構(gòu)也提供了clear( )方法瘾杭,讓你一次性刪除所有鍵值對诅病。
let m = new Map();
m.set("name","劉英");
m.set("gender",1);
m.clear();
console.log(m);
//打印結(jié)果:Map {}
????使用clear方法后,我們再打印一下變量m粥烁,發(fā)現(xiàn)什么都沒有贤笆,一個(gè)空的Map結(jié)構(gòu),說明clear方法起作用了讨阻。
has( )方法
????has( )方法作用:判斷Map實(shí)例內(nèi)是否含有指定的鍵值對芥永,有就返回:true,否則返回:false钝吮。
let m = new Map();
m.set("name","趙鐵柱");
m.has('name');//結(jié)果:true
m.has('age');//結(jié)果:false
Map實(shí)例中含有鍵名:name埋涧,就返回了true,鍵名age不存在奇瘦,就返回false棘催。
可遍歷
????我們可以使用ES6的新特性for...of來遍歷它的鍵名或者鍵值。
entries( )方法
entries( )方法作用:返回實(shí)例的鍵值對遍歷器耳标。
let m = new Map([
["name","趙鐵柱"],
["age",25]
]);
for(let [key,value] of m.entries()){
console.log(key+' '+value);
}
//打印結(jié)果:name 趙鐵柱
// age 25
????m.entries( ) 返回鍵值對的遍歷器醇坝,使用了for...of來遍歷這個(gè)遍歷器,得到的值分別賦值到key和value次坡,然后控制臺分別輸出它們呼猪。
keys( ) 和 values( ) 方法
????keys( )方法:返回實(shí)例所有鍵名的遍歷器。
????values( ) 方法:返回實(shí)例所有鍵值的遍歷器砸琅。
let m = new Map([
["name","趙鐵柱"],
["age",25]
]);
//使用keys方法獲取鍵名
for(let key of m.keys()){
console.log(key);
}
//打印結(jié)果:name
// age
//使用values方法獲取鍵值
for(let value of m.values()){
console.log(value);
}
//打印結(jié)果:趙鐵柱
// 25
forEach( )方法
let m = new Map([
["name","趙鐵柱"],
["age",25]
]);
m.forEach(function(value,key){
console.log(key+':'+value);
});
//打印結(jié)果:name:趙鐵柱
// age:25
????forEach方法接收一個(gè)匿名函數(shù)郑叠,給匿名函數(shù)傳參value和key,分別是Map實(shí)例的鍵名和鍵值
size屬性
????獲取實(shí)例的成員數(shù)明棍。
let m = new Map();
m.set(1,3);
m.set('1','3');
m.size;//結(jié)果:2
WeakMap
????WeakMap結(jié)構(gòu)和Map結(jié)構(gòu)很類似乡革,不同點(diǎn)在于WeakMap結(jié)構(gòu)的鍵名只支持引用類型的數(shù)據(jù)。哪些是引用類型的值呢摊腋?比如:數(shù)組沸版,對象,函數(shù)兴蒸。
let wm = new WeakMap();
let wm = new WeakMap();
//數(shù)組類型的鍵名
wm.set([1],2);
//對象類型的鍵名
wm.set({'name':'Zhangsan'},2);
//函數(shù)類型的鍵名
function fn(){};
wm.set(fn,2);
console.log(wm);
//打邮恿浮:WeakMap {
[1] => 2,
Object {name: "Zhangsan"} => 2,
function => 2
}
WeakMap和Map的區(qū)別
????如果是普通的值類型則不允許。比如:字符串橙凳,數(shù)字蕾殴,null笑撞,undefined,布爾類型钓觉。而Map結(jié)構(gòu)是允許的茴肥,這就是兩者的不同之處,謹(jǐn)記荡灾。
????跟Map一樣瓤狐,WeakMap也擁有g(shù)et、has批幌、delete方法础锐,用法和用途都一樣。不同地方在于荧缘,WeakMap不支持clear方法皆警,不支持遍歷,也就沒有了keys截粗、values信姓、entries、forEach這4個(gè)方法桐愉,也沒有屬性size财破。
????鍵名中的引用類型是弱引用掰派,你永遠(yuǎn)不知道這個(gè)引用對象什么時(shí)候會被垃圾回收機(jī)制回收了从诲,如果這個(gè)引用類型的值被垃圾機(jī)制回收了,WeakMap實(shí)例中的對應(yīng)鍵值對也會消失靡羡。