1.數(shù)據(jù)結(jié)構(gòu)
-
Set的用法
- 可以當(dāng)成數(shù)組來(lái)理解,一種集合;
- set集合中的元素是不能重復(fù)的;(Set這個(gè)特性可以做去重;)
WeakSet的用法
-
Map的用法
- 和Object做對(duì)比;一個(gè)key、一個(gè)value值;object的key一定是字符串;
- Map中的key可以是任意的數(shù)據(jù)類型;比如數(shù)組、一個(gè)對(duì)象作為它的key都可以;
WeakMap的用法
2.怎么用?什么場(chǎng)景用?
Set增加元素用add方法;
-
獲取當(dāng)前Set變量有幾個(gè)元素用size屬性;
{ //向Set里面增加元素的時(shí)候要用add這個(gè)方法; let list = new Set(); list.add(5); list.add(7); //獲取當(dāng)前Set變量有幾個(gè)元素(可以理解原來(lái)數(shù)組的長(zhǎng)度length); console.log('size',list.size); //size 2 } { //Set初始化的時(shí)候就把元素初始化進(jìn)去(默認(rèn)值的意思); let arr = [1,2,3,4,5]; let list = new Set(arr); cosole.log('size',list.size); //5 } -
添加重復(fù)會(huì)報(bào)錯(cuò);
- Set使用很重要的一個(gè)場(chǎng)景就是去重;
{
let list = new Set();
list.add(1);
list.add(2);
//這個(gè)是沒(méi)有成功添加進(jìn)去的;添加重復(fù)的是不會(huì)報(bào)錯(cuò)的,只是不會(huì)生效而已;
list.add(1);
console.log('list',list); //list Set{1,2}
//Set使用很重要的一個(gè)場(chǎng)景就是去重;
//*它在轉(zhuǎn)換元素的時(shí)候,不會(huì)做數(shù)據(jù)類型一個(gè)轉(zhuǎn)換;
let arr =[1,2,3,1,2];
//let arr =[1,2,3,1,'2'];
let list2 = new Set(arr);
console.log('unique',list2); //unique Set{1,2,3}
//console.log('unique',list2); //unique Set{1,2,3,'2'}
}
-
Set方法:add、delete、clear、has
{ let arr =['add','delete','clear','has']; let list = new Set(arr); console.log('has',list.has('add')); //has true console.log('delete',list.delete('add'),list); //輸出:delete true Set{"delete","clear","has"} list.clear(); console.log('list',list);//list Set{} } Set遍歷(讀取)
{
let arr =['add','delete','clear','has'];
let list = new Set(arr);
for(let key of list.keys()){
console.log('keys',key);
//keys add
//keys delete
//keys clear
//keys has
}
for(let value of list.values()){
console.log('value',value);
//value add
//value delete
//value clear
//value has
}
for(let value of list){
console.log('value',value);
//value add
//value delete
//value clear
//value has
}
for(let [key,value] of list.entries()){
console.log('entries',key,value);
//entries add add
//entries delete delete
//entries clear clear
//entries has has
}
list.forEach(function(item){
console.log(item);
});
//add
//delete
//clear
//has
}
-
Set和weakSet的區(qū)別:
-
WeakSet和Set支持的數(shù)據(jù)類型不一樣;
WeakSet的元素只能是對(duì)象,不能是數(shù)值、布爾值、字符串; -
WeakSet中的對(duì)象都是弱引用,不會(huì)檢測(cè)這個(gè)對(duì)象有沒(méi)有在其他地方用過(guò);不會(huì)跟垃圾回收機(jī)制掛鉤上。
(在WeakSet中添加了一個(gè)對(duì)象,這個(gè)對(duì)象不是整個(gè)值拷過(guò)來(lái),它是一個(gè)地址的引用,不會(huì)檢測(cè)這個(gè)地址是不是已經(jīng)被垃圾回收掉了) - weakSet沒(méi)有size屬性 ,沒(méi)有clear方法,不能遍歷;
-
WeakSet和Set支持的數(shù)據(jù)類型不一樣;
{
let weakList = new WeakSet();
let arg = {};
weakList.add(arg);
//weakList.add(2); //會(huì)報(bào)錯(cuò),無(wú)效的值used in weak set;
console.log('weakList',weakList); //weakList weakSet{Object{}}
}
-
Map添加元素用set方法;set(key,value)
- Map中的key可以是任意的數(shù)據(jù)類型;
{
let map = new Map();
let arr = ['123'];
map.set(arr,456);
console.log('map',map,map.get(arr));
//map Map{["123"] =>456} 456
}
-
常用的屬性值和方法:
- Map的遍歷和Set用法是一樣的,keys、values、entries、forEach
{
let map = new Map([['a',123],['b',456]]);
console.log('map args',map);
//map args Map{"a" =>123,"b" =>456}
//獲取map對(duì)象有多少個(gè)元素;
console.log('size',map.size); //size 2
//獲取某一個(gè)用get;
//刪除:delete
console.log('delete',map.delete('a'),map);
//delete true Map{"b" =>456}
//清空clear
console.log('clear',map.clear(),map);
//clear undefined Map{}
//Map的遍歷和Set用法是一樣的,keys、values、entries、forEach
}
-
WeakMap和Map的區(qū)別:
- WeakMap接收的key值必須是對(duì)象,不能是其他的;
- WeakMap沒(méi)有size屬性,不能使用clear;
- WeakMap不能遍歷;
{ let weakmap = new WeakMap(); let o ={}; weakmap.set(o,123); console.log(weakmap.get(o)); //123 }