set
set
類似于數(shù)組,但是沒有重復(fù)的值漫玄。
方法
Set.prototype.add(value)
:添加某個(gè)值睦优,返回 Set 結(jié)構(gòu)本身。Set.prototype.delete(value)
:刪除某個(gè)值皱碘,返回一個(gè)布爾值隐孽,表示刪除是否成功家凯。Set.prototype.has(value)
:返回一個(gè)布爾值绊诲,表示該值是否為Set
的成員褪贵。Set.prototype.clear()
:清除所有成員,沒有返回值世舰。
注意:set加入值的時(shí)候槽卫,不會(huì)發(fā)生類型轉(zhuǎn)換歼培。另外,加入NaN
的時(shí)候查剖,認(rèn)為等于自身噪窘。兩個(gè)對(duì)象總是不相等的倔监。
遍歷操作
-
Set.prototype.keys()
:返回鍵名的遍歷器 -
Set.prototype.values()
:返回鍵值的遍歷器 -
Set.prototype.entries()
:返回鍵值對(duì)的遍歷器 -
Set.prototype.forEach()
:使用回調(diào)函數(shù)遍歷每個(gè)成員
利用遍歷實(shí)現(xiàn)交集、并集和差集:
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}
// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}
// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}
在遍歷操作中同步改變set結(jié)構(gòu)有以下兩種方法:
// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6
// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6
WeakSet
weakset和set類似静暂,有兩個(gè)主要區(qū)別:
weakset的成員只能是對(duì)象
weakset中的對(duì)象是弱引用籍嘹,如果其他對(duì)象不引用該對(duì)象弯院,垃圾回收機(jī)制會(huì)自動(dòng)回收對(duì)象所占的內(nèi)存泪掀。因此异赫,weakset的成員不適用于引用头岔,也不可遍歷鼠证。
方法
-
WeakSet.prototype.add(value)
:向 WeakSet 實(shí)例添加一個(gè)新成員量九。 -
WeakSet.prototype.delete(value)
:清除 WeakSet 實(shí)例的指定成員。 -
WeakSet.prototype.has(value)
:返回一個(gè)布爾值类浪,表示某個(gè)值是否在 WeakSet 實(shí)例之中肌似。
const a = [[1, 2], [3, 4]];
const ws = new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}
注意:weakset可以接受一個(gè)數(shù)組或類似數(shù)組的對(duì)象作為參數(shù)川队,但是成為weakset成員的是數(shù)組的成員而不是數(shù)組本身,所以數(shù)組的成員只能是對(duì)象
weakset的一個(gè)用處是存儲(chǔ)DOM節(jié)點(diǎn)艳汽,不用擔(dān)心這些節(jié)點(diǎn)移除的時(shí)候會(huì)發(fā)生內(nèi)存泄漏对雪。
Map
作用:解決了對(duì)象只能用字符串作為鍵值的問題
用法:Map可接受一個(gè)數(shù)組作為參數(shù)瑟捣,數(shù)組中的元素是一個(gè)表示鍵值對(duì)的數(shù)組。
注意:Map的鍵實(shí)際上是與內(nèi)存地址綁定的捐祠,內(nèi)存地址不一樣的兩個(gè)值就視為兩個(gè)鍵踱蛀。如果兩個(gè)值嚴(yán)格相等就視為一個(gè)鍵
屬性和方法
-
size屬性
size
屬性返回map結(jié)構(gòu)的成員總數(shù) -
Map.prototype.set(key, value)
set方法返回當(dāng)前map對(duì)象贵白。設(shè)置方法如下:
const m = new Map(); m.set('edition', 6) // 鍵是字符串 m.set(262, 'standard') // 鍵是數(shù)值 m.set(undefined, 'nah') // 鍵是 undefined
可以更改value的值禁荒,為key重新賦值
另外,可以采取鏈?zhǔn)綄懛?/p>
let map = new Map() .set(1, 'a') .set(2, 'b') .set(3, 'c');
-
Map.prototype.get(key)
該方法用于讀取key對(duì)應(yīng)的鍵值勃痴,如果找不到key,則返回undefined
-
Map.prototype.has(key)
用于判斷一個(gè)key是否在map對(duì)象中劣领,返回一個(gè)布爾值
-
Map.prototype.delete(key)
用于刪除一個(gè)鍵铁材,成功返回true
-
Map.prototype.clear()
用于清除所有成員
遍歷方法
-
Map.prototype.keys()
:返回鍵名的遍歷器衫贬。 -
Map.prototype.values()
:返回鍵值的遍歷器。 -
Map.prototype.entries()
:返回所有成員的遍歷器梆造。 -
Map.prototype.forEach()
:遍歷 Map 的所有成員镇辉。
用法如下:
for (let key of map.keys()) {
console.log(key);
}
for (let value of map.values()) {
console.log(value);
}
for (let item of map.entries()) {
console.log(item[0], item[1]);
}
除此之外贴捡,還可以用數(shù)組的map方法、foreach方法和filter方法屹逛,可以實(shí)現(xiàn)map的遍歷和過濾汛骂,用法如下:
const map0 = new Map()
.set(1, 'a')
.set(2, 'b')
.set(3, 'c');
const map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
// 產(chǎn)生 Map 結(jié)構(gòu) {1 => 'a', 2 => 'b'}
const map2 = new Map(
[...map0].map(([k, v]) => [k * 2, '_' + v])
);
// 產(chǎn)生 Map 結(jié)構(gòu) {2 => '_a', 4 => '_b', 6 => '_c'}
與其他數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換
-
Map轉(zhuǎn)成數(shù)組
最簡(jiǎn)便的方法就是使用擴(kuò)展運(yùn)算符
...
-
數(shù)組轉(zhuǎn)成Map
將數(shù)組傳入構(gòu)造函數(shù)就可以實(shí)現(xiàn):
new Map([ [true, 7], [{foo: 3}, ['abc']] ])
-
Map轉(zhuǎn)成對(duì)象
function strMapToObj(strMap) { let obj = Object.create(null); for (let [k,v] of strMap) { obj[k] = v; } return obj; } const myMap = new Map() .set('yes', true) .set('no', false); strMapToObj(myMap) // { yes: true, no: false }
直接遍歷再將鍵值插入對(duì)象中就好了淑掌。
如果鍵不是字符串蝶念,會(huì)將鍵名轉(zhuǎn)換成字符串,再作為對(duì)象鍵名担敌。
-
對(duì)象轉(zhuǎn)成Map
遍歷對(duì)象中的元素柄错,再用set方法加入map中
-
Map轉(zhuǎn)成JSON
鍵名都是字符串苦酱,可以先將Map轉(zhuǎn)成對(duì)象,再轉(zhuǎn)成JSON格式
-
鍵名有非字符串疫萤,可以轉(zhuǎn)成數(shù)組JSON
function mapToArrayJson(map) { return JSON.stringify([...map]); } let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']); mapToArrayJson(myMap) // '[[true,7],[{"foo":3},["abc"]]]'
-
JSON轉(zhuǎn)成Map
先轉(zhuǎn)成對(duì)象再轉(zhuǎn)成JSON
-
如果JSON是一個(gè)數(shù)組,且每個(gè)數(shù)組成員本身,又是一個(gè)有兩個(gè)成員的數(shù)組遇骑。這時(shí)棉浸,它可以一一對(duì)應(yīng)地轉(zhuǎn)為 Map。這往往是 Map 轉(zhuǎn)為數(shù)組 JSON 的逆操作尾序。
function jsonToMap(jsonStr) { return new Map(JSON.parse(jsonStr)); } jsonToMap('[[true,7],[{"foo":3},["abc"]]]') // Map {true => 7, Object {foo: 3} => ['abc']}
WeakMap
與Map的區(qū)別:
WeakMap只接受對(duì)象作為鍵名(null除外)
WeakMap的鍵名所指向的對(duì)象钓丰,不計(jì)入垃圾回收機(jī)制
語法:
- 與Map相比沒有遍歷操作,沒有size屬性
- 四個(gè)方法:
set()
get()
has()
delete()