Set
ES6提供了新的數(shù)據(jù)結(jié)構(gòu)Set。它類似于數(shù)組,但是成員的值都是唯一的,沒(méi)有重復(fù)的值。(*因此可以不要像以前那樣遍歷數(shù)組去重)學(xué)習(xí)一個(gè)新特性可以試著看看他出現(xiàn)的原原因
Set函數(shù)可以接受一個(gè)數(shù)組(或類似數(shù)組的對(duì)象)作為參數(shù),用來(lái)初始化。
// 例一
var set = new Set([1, 2, 3, 4, 4]);
[...set]
// [1, 2, 3, 4]
var s = new Set();
[2, 3, 5, 4, 5, 2, 2].map(x => s.add(x));
for (let i of s) {
console.log(i);
}
// 2 3 5 4
在Set內(nèi)部,兩個(gè)NaN是相等。兩個(gè)對(duì)象總是不相等的。可以用length來(lái)檢測(cè)
四個(gè)操作方法:
-
add(value):添加某個(gè)值,返回Set結(jié)構(gòu)本身。 -
delete(value):刪除某個(gè)值,返回一個(gè)布爾值,表示刪除是否成功。 -
has(value):返回一個(gè)布爾值,表示該值是否為Set的成員。 -
clear():清除所有成員,沒(méi)有返回值
set內(nèi)部的元素可以遍歷for...of...
Map
Map結(jié)構(gòu)提供了“值—值”的對(duì)應(yīng),是一種更完善的Hash結(jié)構(gòu)實(shí)現(xiàn)。如果你需要“鍵值對(duì)”的數(shù)據(jù)結(jié)構(gòu),Map比Object更合適。它類似于對(duì)象,也是鍵值對(duì)的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對(duì)象)都可以當(dāng)作鍵。
var m = new Map();
var o = {p: "Hello World"};
m.set(o, "content")
m.get(o) // "content"
m.has(o) // true
m.delete(o) // true
m.has(o) // false
注意,只有對(duì)同一個(gè)對(duì)象的引用,Map結(jié)構(gòu)才將其視為同一個(gè)鍵。這一點(diǎn)要非常小心。
var map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined
// 因?yàn)?['a'] !== ['a'] 這是兩個(gè)對(duì)象只是長(zhǎng)得一樣
上面代碼的set和get方法,表面是針對(duì)同一個(gè)鍵,但實(shí)際上這是兩個(gè)值,內(nèi)存地址是不一樣的,因此get方法無(wú)法讀取該鍵,返回undefined。
如果Map的鍵是一個(gè)簡(jiǎn)單類型的值(數(shù)字、字符串、布爾值),則只要兩個(gè)值嚴(yán)格相等,Map將其視為一個(gè)鍵,包括0和-0。另外,雖然NaN不嚴(yán)格相等于自身,但Map將其視為同一個(gè)鍵。
實(shí)例屬性和方法:size、set、get、has、delete、clear
遍歷方法:keys()、values()、entries()、forEach()