map對象是一個簡單的鍵/值映射。任何值(包括對象和原始值)均可以用做一個鍵或一個值。javascript
var m = new Map(); var o = {p: "Hello World"}; m.set(o, "content") m.get(o) // "content"
上面代碼使用set方法,將對象o看成m的一個鍵。java
Map也能夠接受一個數組做爲參數。該數組的成員是一個個表示鍵值對的數組。算法
var map = new Map([["name", "張三"], ["title", "Author"]]); map.size // 2 map.get("name") // "張三" map.get("title") // "Author"
上面代碼在新建Map實例時,就指定了兩個鍵name和title。數組
注意Map的鍵其實是跟內存地址綁定的,只要內存地址不同,就視爲兩個鍵。數據結構
var map = new Map([["name", "張三"], ["title", "Author"]]); console.log(map.size); // 2 console.log(map.get("name")); // "張三" console.log(map.get("title")); // "Author" map.set("keyString",'a string'); console.log(map.get("keyString")); 運行結果: > > 2 > 張三 > Author > a string
size屬性返回Map結構的成員總數。即返回映射對象中的鍵/值對的數目。函數
set(key, value)方法設置key所對應的鍵值,而後返回整個Map結構。若是key已經有值,則鍵值會被更新,不然就新生成該鍵。this
var m = new Map(); m.set("edition", 6) // 鍵是字符串 m.set(262, "standard") // 鍵是數值 m.set(undefined, "nah") // 鍵是undefined
set方法返回的是Map自己,所以能夠採用鏈式寫法。spa
get(key)方法讀取key對應的鍵值,若是找不到key,返回undefined。prototype
has(key)方法返回一個布爾值,表示某個鍵是否在Map數據結構中。對象
delete(key)方法刪除某個鍵,返回true。若是刪除失敗,返回false。
clear()方法清除全部成員,沒有返回值。
Map原生提供三個遍歷器生成函數和一個遍歷方法。
- keys():返回鍵名的遍歷器。
- values():返回鍵值的遍歷器。
- entries():返回全部成員的遍歷器。
- forEach():遍歷Map的全部成員。
var myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); for (var key of myMap.keys()) { console.log(key); } // Will show 2 logs; first with "0" and second with "1" for (var value of myMap.values()) { console.log(value); } // Will show 2 logs; first with "zero" and second with "one" for (var item of myMap.entries()) { console.log(item[0] + " = " + item[1]); } // Will show 2 logs; first with "0 = zero" and second with "1 = one" myMap.forEach(function(value, key) { console.log(key + " = " + value); }, myMap)
運行結果:
>
> 0
> 1
> zero
> one
> 0 = zero
> 1 = one
> 0 = zero
> 1 = one
ES6提供了新的數據結構Set。它相似於數組,可是成員的值都是惟一的,沒有重複的值。
Set自己是一個構造函數,用來生成Set數據結構。
var s = new Set(); [2,3,5,4,5,2,2].map(x => s.add(x)) for (i of s) {console.log(i)} // 2 3 5 4
上面代碼經過add方法向Set結構加入成員,結果代表Set結構不會添加劇復的值。使用箭頭函數形式。
向Set加入值的時候,不會發生類型轉換,因此5和"5"是兩個不一樣的值。Set內部判斷兩個值是否不一樣,使用的算法相似於精確相等運算符(===),這意味着,兩個對象老是不相等的。惟一的例外是NaN等於自身(精確相等運算符認爲NaN不等於自身)。
let set = new Set(); set.add({}) set.size // 1 set.add({}) set.size // 2
上面代碼表示,因爲兩個空對象不是精確相等,因此它們被視爲兩個值。
示例:
請建立一個Set對象,並把1添加進去,咱們來判斷2是否被添加進去(has()函數),並打印看結果。
var s = new Set(); s.add(1); s.add(2); console.log(s.has(2));
運行結果:
>
> true
Set結構的實例有如下屬性。
- Set.prototype.constructor:構造函數,默認就是Set函數。
- Set.prototype.size:返回Set實例的成員總數。
Set實例的方法分爲兩大類:操做方法(用於操做數據)和遍歷方法(用於遍歷成員)。下面先介紹四個操做方法。
- add(value):添加某個值,返回Set結構自己。
- delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
- has(value):返回一個布爾值,表示該值是否爲Set的成員。
- clear():清除全部成員,沒有返回值。 上面這些屬性和方法的實例以下。
var s = new Set(); s.add(1).add(2).add(2); // 注意2被加入了兩次 console.log(s.size); // 2 console.log(s.has(1)); // true console.log(s.has(2)); // true console.log(s.has(3)); // false console.log(s.delete(2)); console.log(s.has(2)); // false
Set結構的實例有四個遍歷方法,能夠用於遍歷成員。
- keys():返回一個鍵名的遍歷器
- values():返回一個鍵值的遍歷器
- entries():返回一個鍵值對的遍歷器
- forEach():使用回調函數遍歷每一個成員
key方法、value方法、entries方法返回的都是遍歷器對象。因爲Set結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),因此key方法和value方法的行爲徹底一致。
let set = new Set(['red', 'green', 'blue']); for ( let item of set.keys() ){ console.log(item); } // red green blue for ( let item of set.values() ){ console.log(item); } // red green blue for ( let item of set.entries() ){ console.log(item); } // ["red", "red"] ["green", "green"] ["blue", "blue"]
上面代碼中,entries方法返回的遍歷器,同時包括鍵名和鍵值,因此每次輸出一個數組,它的兩個成員徹底相等。
Set結構的實例的forEach方法,用於對每一個成員執行某種操做,沒有返回值。
let set = new Set([1, 2, 3]); set.forEach((value, key) => console.log(value * 2) ) // 2 4 6
上面代碼說明,forEach方法的參數就是一個處理函數。該函數的參數依次爲鍵值、鍵名、集合自己(上例省略了該參數)。另外,forEach方法還能夠有第二個參數,表示綁定的this對象。