ES6學習筆記三:Symbol、Set、Map

 一:Symbol數組

ES6 引入了一種新的原始數據類型Symbol,表示獨一無二的值。它是 JavaScript 語言的第七種數據類型,前六種是:undefinednull、布爾值(Boolean)、字符串(String)、數值(Number)、對象(Object)。數據結構

對象的屬性名如今能夠有兩種類型,一種是原來就有的字符串,另外一種就是新增的 Symbol 類型。凡是屬性名屬於 Symbol 類型,就都是獨一無二的,能夠保證不會與其餘屬性名產生衝突。函數

1)Symbol 值經過Symbol函數生成,而不是使用new命令,不然會報錯。spa

var s1 = Symbol(描述);

2)Symbol函數的參數只是表示對當前 Symbol 值的描述,相同參數的Symbol函數的返回值是不相等的:prototype

var s1 = Symbol('foo');
var s2 = Symbol('foo');

s1 === s2 // false

3)使用:使用 Symbol 值定義屬性時,Symbol 變量必須放在方括號之中被賦值,也即:symbol類型的內容做爲屬性名時,只能用[]來訪問code

var mySymbol = Symbol();
var a = {};
a[mySymbol] = 'Hello!';

Symbol 值做爲對象屬性名時,不能用點運算符來調用,不然會把symbol做爲了一個字符串類型的屬性名,喪失了獨一性:對象

var mySymbol = Symbol();
var a = {};

a.mySymbol = 'Hello!';//致使mysymbol轉變成了字符串屬性名
a[mySymbol] // undefined
a['mySymbol'] // "Hello!"  

4)Symbol值做爲屬性名時的屬性遍歷blog

Symbol值做爲屬性名,該屬性不會出如今for...infor...of循環中,也不會被Object.keys()Object.getOwnPropertyNames()JSON.stringify()返回。可是,有一個Object.getOwnPropertySymbols方法,能夠獲取指定對象的全部 Symbol 屬性名。接口

Object.getOwnPropertySymbols方法返回一個數組,成員是當前對象的全部用做屬性名的 Symbol 值。ip

5)使用同一個Symbol值:

Symbol.for方法能夠作到這一點。它接受一個字符串做爲參數,而後搜索有沒有以該參數做爲名稱的Symbol值。若是有,就返回這個Symbol值,不然就新建並返回一個以該字符串爲名稱的Symbol值。

var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');

s1 === s2 // true

Symbol.keyFor方法返回一個已登記的 Symbol 類型值的key,即建立的時候的描述參數:

var s1 = Symbol.for("foo");
Symbol.keyFor(s1) // "foo"

 

二:Set

ES6 提供了新的數據結構 Set。它相似於數組,可是成員的值都是惟一的,沒有重複的值。

1)建立

 s = new Set(參數);

2)操做

四個操做方法。

  • add(value):添加某個值,返回Set結構自己。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否爲Set的成員。
  • clear():清除全部成員,沒有返回值。

 3)遍歷

四個遍歷方法,能夠用於遍歷成員。

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對的遍歷器
  • forEach(回調函數):使用回調函數遍歷每一個成員

Set的遍歷順序就是插入順序。這個特性有時很是有用,好比使用Set保存一個回調函數列表,調用時就能保證按照添加順序調用。

 

三:WeekSet

WeakSet 的成員只能是對象,而不能是其餘類型的值。

WeakSet 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,若是其餘對象都再也不引用該對象,那麼垃圾回收機制會自動回收該對象所佔用的內存,不考慮該對象還存在於 WeakSet 之中。

1)建立

const ws = new WeakSet(參數);//具備 Iterable 接口的對象,均可以做爲 WeakSet 的參數

2)操做

WeakSet 結構有如下三個方法。

  • WeakSet.prototype.add(value):向 WeakSet 實例添加一個新成員。
  • WeakSet.prototype.delete(value):清除 WeakSet 實例的指定成員。
  • WeakSet.prototype.has(value):返回一個布爾值,表示某個值是否在 WeakSet 實例之中。


四:Map

鍵值對的集合,可是「鍵」的範圍不限於字符串,各類類型的值(包括對象)均可以看成鍵。

1)建立

const map = new Map(......);

不單單是數組,任何具備 Iterator 接口、且每一個成員都是一個雙元素的數組的數據結構均可以看成Map構造函數的參數。

2)操做

size屬性返回 Map 結構的成員總數。

set方法設置鍵名key對應的鍵值爲value,而後返回整個 Map 結構。若是key已經有值,則鍵值會被更新,不然就新生成該鍵。【這裏的key能夠是任何對象】

get方法讀取key對應的鍵值,若是找不到key,返回undefined

has方法返回一個布爾值,表示某個鍵是否在當前 Map 對象之中。

delete方法刪除某個鍵,返回true。若是刪除失敗,返回false

clear方法清除全部成員,沒有返回值。

3)遍歷

  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回全部鍵值對的遍歷器。
  • forEach(回調函數):遍歷 Map 的全部鍵值對,用回調函數處理。

Map 的遍歷順序就是插入順序。

4)與其它數據結構的相互轉換
map轉數組:使用擴展運算符(...

const myMap = new Map()
  .set(true, 7)
  .set({foo: 3}, ['abc']);
[...myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]

數組轉map:數組傳入 Map 構造函數,就能夠轉爲 Map。

map轉對象:Map 的鍵都是字符串,它能夠轉爲對象:把map傳給對象的構造函數,提取map中內容做爲屬性。

對象轉map:遍歷對象的屬性,使用map.set(key,value)添加到map中

 

五:WeekMap

WeakMap只接受對象做爲鍵名(null除外),不接受其餘類型的值做爲鍵名。

WeakMap的鍵名所指向的對象是弱引用,不計入垃圾回收機制。

WeakMap 與 Map 在 API 上的區別主要是兩個,一是沒有遍歷操做(即沒有key()values()entries()方法),也沒有size屬性。

二是沒法清空,即不支持clear方法。所以,WeakMap只有四個方法可用:get()set()has()delete()

相關文章
相關標籤/搜索