Set
ES6提供了新的數據結構Set。它類似于數組,但是成員的值都是唯一的,沒有重復的值。(*因此可以不要像以前那樣遍歷數組去重)
學習一個新特性可以試著看看他出現的原原因
Set函數可以接受一個數組(或類似數組的對象)作為參數,用來初始化。
// 例一
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內部,兩個NaN
是相等。兩個對象總是不相等的。可以用length來檢測
四個操作方法:
-
add(value)
:添加某個值,返回Set結構本身。 -
delete(value)
:刪除某個值,返回一個布爾值,表示刪除是否成功。 -
has(value)
:返回一個布爾值,表示該值是否為Set
的成員。 -
clear()
:清除所有成員,沒有返回值
set內部的元素可以遍歷for...of...
Map
Map結構提供了“值—值”的對應,是一種更完善的Hash結構實現。如果你需要“鍵值對”的數據結構,Map比Object更合適。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。
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
注意,只有對同一個對象的引用,Map結構才將其視為同一個鍵。這一點要非常小心。
var map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined
// 因為 ['a'] !== ['a'] 這是兩個對象只是長得一樣
上面代碼的set和get方法,表面是針對同一個鍵,但實際上這是兩個值,內存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。
如果Map的鍵是一個簡單類型的值(數字、字符串、布爾值),則只要兩個值嚴格相等,Map將其視為一個鍵,包括0和-0。另外,雖然NaN不嚴格相等于自身,但Map將其視為同一個鍵。
實例屬性和方法:size、set、get、has、delete、clear
遍歷方法:keys()、values()、entries()、forEach()