ES6-新內容(一)Symbol和Set、Map

  1. Symbol 原始數據類型
  2. Set和Map 數據結構

一、Symbol

ES6引入了一種新的原始數據類型Symbol,表示獨一無二的值。

  • 通過Symbol函數生成。
  • 基本上,它是一種類似於字符串的數據類型。
  • 可以接受一個字符串作爲參數,表示對Symbol實例的描述,主要是爲了在控制檯顯示,或者轉爲字符串時,比較容易區分。
  • Symbol函數的參數只是表示對當前 Symbol 值的描述,因此相同參數的Symbol函數的返回值是不相等的。
  • Symbol值不能與其他類型的值進行運算,會報錯。
  • Symbol值可以顯式轉爲字符串和布爾值,但是不能轉爲數值。
1.作爲屬性名

由於每一個Symbol值都是不相等的,這意味着Symbol值可以作爲標識符,用於對象的屬性名,就能保證不會出現同名的屬性。

Symbol值作爲對象屬性名時,不能用點運算符。

var mySymbol = Symbol();

// 第一種寫法
var a = {};
a[mySymbol] = 'Hello!';

// 第二種寫法
var a = {
  [mySymbol]: 'Hello!'
};

// 第三種寫法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上寫法都得到同樣結果
a[mySymbol] // "Hello!"
2.API
方法 說明 備註
Symbol() Symbol類型的構造函數 沒有登記機制,所以每次調用都會返回一個不同的值
Symbol.for() 接受一個字符串作爲參數,然後搜索有沒有以該參數作爲名稱的Symbol值。如果有,就返回這個Symbol值,否則就新建並返回一個以該字符串爲名稱的Symbol值。 有時,我們希望重新使用同一個Symbol值,Symbol.for方法可以做到這一點。
Symbol.keyFor() 返回一個已登記的 Symbol 類型值的key Symbol.for()方法纔會登記;Symbol()方法不會登記。只有登記的,Symbol.keyFor()纔有返回值,否則返回undefined
3.屬性

提供了11個內置的Symbol值,指向語言內部使用的方法。
開發不常用就不記錄了。

二、Set 和 Map

1.Set
  • 類似於數組,但是成員的值都是唯一的,沒有重複的值。
  • Set本身是一個構造函數,用來生成Set數據結構。
  • 一種去除數組重複成員的方法 : [...new Set(array)]

屬性

屬性 說明
set.constructor 構造函數,默認就是Set函數
set.size 返回Set實例的成員總數

方法

方法 說明
set.add(value) 添加某個值,返回Set結構本身
set.delete(value) 刪除某個值,返回一個布爾值,表示刪除是否成功
set.has(value) 返回一個布爾值,表示該值是否爲Set的成員
set.clear() 清除所有成員,沒有返回值

遍歷操作 (Set的遍歷順序就是插入順序)
keys()
values()
entries()
forEach()
數組的map和filter方法

2.WeakSet

WeakSet結構與Set類似,也是不重複的值的集合。但是,它與Set有兩個區別:

  • WeakSet的成員只能是對象,而不能是其他類型的值。
  • WeakSet中的對象都是弱引用,即垃圾回收機制不考慮WeakSet對該對象的引用,也就是說,如果其他對象都不再引用該對象,那麼垃圾回收機制會自動回收該對象所佔用的內存,不考慮該對象還存在於WeakSet之中。這個特點意味着,無法引用WeakSet的成員,因此WeakSet是不可遍歷的。

方法

方法 說明
new WeakSet() 構造函數
ws.add(value) 向WeakSet實例添加一個新成員
ws.delete(value) 清除WeakSet實例的指定成員
ws.has(value) 返回一個布爾值,表示某個值是否在WeakSet實例之中
3.Map

是鍵值對的集合,但是“鍵”的範圍不限於字符串,各種類型的值(包括對象)都可以當作鍵。Map結構提供了“值—值”的對應,是一種更完善的Hash結構實現。
屬性和方法

屬性或方法 說明 備註
size屬性 返回Map結構的成員總數。
set(key, value) 設置key所對應的鍵值,然後返回整個Map結構。如果key已經有值,則鍵值會被更新,否則就新生成該鍵 set方法返回的是Map本身,因此可以採用鏈式寫法
get(key) 讀取key對應的鍵值,如果找不到key,返回undefined
has(key) 返回一個布爾值,表示某個鍵是否在Map數據結構中
delete(key) 刪除某個鍵,返回true。如果刪除失敗,返回false。
clear() 清除所有成員,沒有返回值

遍歷方法(Map的遍歷順序就是插入順序)
keys()
values()
entries()
forEach()

Map、對象、數組、Json對象的轉換

4.WeakMap

與Map結構基本類似,唯一的區別是它只接受對象作爲鍵名(null除外),不接受其他類型的值作爲鍵名,而且鍵名所指向的對象,不計入垃圾回收機制。有助於防止內存泄漏。

WeakMap與Map在API上的區別主要是兩個,一是沒有遍歷操作(即沒有key()、values()和entries()方法),也沒有size屬性;二是無法清空,即不支持clear方法。這與WeakMap的鍵不被計入引用、被垃圾回收機制忽略有關。因此,WeakMap只有四個方法可用:get()、set()、has()、delete()。

  • 應用的典型場合就是DOM節點作爲鍵名。
  • 部署私有屬性。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章