Set (集合)
ES6提供了一種新的數(shù)據(jù)結(jié)構(gòu)Set,Set類似數(shù)組气筋,但值唯一编丘,本身為構(gòu)造函數(shù)买窟,用來生成Set數(shù)據(jù)結(jié)構(gòu)胚迫,可以容納任何數(shù)據(jù)類型的任何值
[value, value]形式
- 創(chuàng)建Set
let set = new Set([1, 2, 2, 3])
console.log(set);
//Set(3) { 1, 2, 3 }
Set可以接受一個數(shù)組作為參數(shù)钝鸽,用來初始化
- Set實例的屬性和方法
屬性:
Set.prototype.constructor
構(gòu)造函數(shù)汇恤,默認為 Set函數(shù)
Set.prototype.size
返回Set實例成員的總數(shù)
方法:
分為操作方法和遍歷方法
1.操作方法
add()
向 Set 添加新元素,返回 Set 結(jié)構(gòu)本身拔恰。
clear()
清除所有成員因谎,沒有返回值
delete()
刪除某個值,返回一個布爾值颜懊,表示刪除是否成功财岔。
has()
返回一個布爾值风皿,表示該值是否為Set的成員
let set = new Set(),
a = NaN,
b = NaN,
c = 1,
d = '1'
set.add(a).add(b).add(c).add(d)
console.log(set); //Set(3) { NaN, 1, '1' }
向Set加入值時,不會發(fā)生類型轉(zhuǎn)換匠璧,1和 '1'是兩個不同的值桐款,類似于精確相等運算符,但是認為NaN等于自身
2.遍歷方法
keys()
返回 Set 對象中值的數(shù)組夷恍。
values()
與 keys() 相同魔眨。
entries()
返回 Set 對象中值的數(shù)組。
forEach()
為每個元素調(diào)用回調(diào)酿雪。
let set = new Set([1, 2, 2, 3])
console.log(set.keys());
console.log(set.values());
/*
[Set Iterator] { 1, 2, 3 }
[Set Iterator] { 1, 2, 3 }
*/
Set 結(jié)構(gòu)沒有鍵名冰沙,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致执虹。
for (let key of set.keys()) {
console.log(key);
}
1
2
3
let set = new Set([1, 2, 2, 3])
console.log(set.entries());
//[Set Entries] { [ 1, 1 ], [ 2, 2 ], [ 3, 3 ] }
entries方法返回的遍歷器拓挥,同時包括鍵名和鍵值,所以每次輸出一個數(shù)組袋励,它的兩個成員完全相等
for (let item of set.entries()) {
console.log(item[0]);
}
1
2
3
let set = new Set([1, 2, 2, 3])
set.forEach(value => console.log(value * 10))
/*
10
20
30
*/
Map(字典)
JS中的對象(Object),本質(zhì)上是鍵值對的集合侥啤,但傳統(tǒng)上只能用字符串作為鍵,Map數(shù)據(jù)結(jié)構(gòu)類似于對象茬故,但鍵的內(nèi)容不拘束于字符串盖灸,任何類型的值(包括對象)都可當作鍵
[key, value]形式
- 基本的 Map() 方法
set()
為 Map 對象中的鍵設(shè)置值。
get()
獲取 Map 對象中鍵的值磺芭。
entries()
返回 Map 對象中鍵/值對的數(shù)組
keys()
返回 Map 對象中鍵的數(shù)組赁炎。
values()
返回 Map 對象中值的數(shù)組。 - 創(chuàng)建Map對象
var map = new Map()
var obj = {name : 'harry'}
let a = map.set(obj, 'potter') //將obj作為map的鍵钾腺,并為其設(shè)置鍵值
let b = map.get(obj)
console.log(a); //Map(1) { { name: 'harry' } => 'potter' }
console.log(b); //potter
var arrObj = [
['name' ,'harry'],
['age' ,18],
['hobby' ,'magic']
]
var map = new Map(arrObj)
console.log(map); //Map(3) { 'name' => 'harry', 'age' => 18, 'hobby' => 'magic' }
Map構(gòu)造函數(shù)還可接受一個數(shù)組作為參數(shù)徙垫,數(shù)組成員為一個個鍵值對的數(shù)組成員
console.log(map.keys()); //[Map Iterator] { 'name', 'age', 'hobby' }
console.log(map.values()); //[Map Iterator] { 'harry', 18, 'magic' }
console.log(map.entries());
/*
[Map Entries] {
[ 'name', 'harry' ],
[ 'age', 18 ],
[ 'hobby', 'magic' ]
}
*/
for (let key of map.keys()) {
console.log(key);
}
// name
// age
// hobby
for (let item of map.entries()) {
console.log(item[0]);
}
// name
// age
// hobby
- Map 的鍵實際上是跟內(nèi)存地址綁定的,只要內(nèi)存地址不一樣放棒,就視為兩個鍵(引用數(shù)據(jù)類型)
var map = new Map()
var arr = [1]
//鍵的內(nèi)存地址一樣
let a = map.set(arr, 'one')
let b = map.get(arr)
console.log(a); //Map(1) { [ 1 ] => 'one' }
console.log(b); //one
var map = new Map()
//鍵的內(nèi)存地址不同姻报,即使內(nèi)容相同
let a = map.set([1], 'one')
let b = map.get([1])
console.log(a); //Map(1) { [ 1 ] => 'one' }
console.log(b); //undefined
簡單數(shù)據(jù)類型(Number, String, Boolean)只要嚴格相等,Map將其視為一個鍵
- 其他Map方法
clear()
刪除 Map 中的所有元素间螟。
delete()
刪除由鍵指定的元素吴旋。
has()
如果鍵存在,則返回 true厢破。
forEach()
為每個鍵/值對調(diào)用回調(diào)荣瑟。
var arrObj = [
['name' ,'harry'],
['age' ,18],
['hobby' ,'magic']
]
var map = new Map(arrObj)
console.log(map.has('age')); //true
console.log(map.has('height')); //false
map.delete('name')
console.log(map); //Map(2) { 'age' => 18, 'hobby' => 'magic' }
map.clear()
console.log(map); //Map(0) {}
map.forEach(callback, this)
forEach方法可以接受兩個參數(shù),第二個參數(shù)可為其指定this的指向
Set 和Map的區(qū)別
- Map是鍵值對摩泪,Set是值的集合笆焰,鍵和值可以為任何值
- Map可以通過get方法獲取值,Set不行加勤,因為Set只有值
- 都能夠通過迭代器進行for ... of 遍歷
- Set的值唯一仙辟,可以用來做數(shù)組去重,Map沒有格式限制鳄梅,可以做數(shù)據(jù)存儲
WeakSet和WeakMap
WeakSet
WeakSet和Set類似叠国,但其成員只能為對象,不能是其他類型的值戴尸,WeakSet中的對象都是弱引用粟焊,只存儲引用,不存儲值孙蒙,垃圾回收機制不考慮WeakSet對該對象的引用项棠,當沒有其他對象引用該對象時,垃圾回收機制會自動回收該對象占用的內(nèi)存挎峦,不考慮該對象還存在于 WeakSet 之中香追,基于此,WeakSet無法遍歷坦胶,因為我們無法確認其內(nèi)部成員是否還存在透典,有可能已被垃圾回收機制回收
- 語法
WeakSet 是一個構(gòu)造函數(shù),可以使用new命令顿苇,創(chuàng)建 WeakSet 數(shù)據(jù)結(jié)構(gòu)
可接受一個數(shù)組或類數(shù)組對象作為參數(shù)
const a = [[1, 2], [3, 4]]
const ws = new WeakSet(a)
console.log(ws);
WeakSet結(jié)構(gòu)有三個方法:
add()
向 WeakSet 實例添加一個新成員峭咒。delete()
清除 WeakSet 實例的指定成員has()
返回一個布爾值,表示某個值是否在 WeakSet 實例之中三個方法與Set同名方法類似
WeakMap
WeakMap結(jié)構(gòu)與Map結(jié)構(gòu)類似纪岁,也是用于生成鍵值對的集合
WeakMap只接受對象作為鍵名(null除外)凑队,不接受其他類型的值作為鍵名
WeakMap的鍵名所指向的對象,不計入垃圾回收機制
鍵名是弱引用幔翰,鍵值可以是任意的漩氨,鍵名所指向的對象可以被垃圾回收,此時鍵名是無效的遗增。與WeakSet一樣才菠,無法遍歷
const obj = { 'name' : 'harry'}
const wm = new WeakMap()
wm.set(obj, 'potter')
console.log(wm);
WeakMap的方法
delete()
get()
has()
set()
用法與Map的同名方法類似