- Symbol 原始數據類型
- 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節點作爲鍵名。
- 部署私有屬性。