Symbol
概念
Symbol:一種新的原始資料類型,表示獨一無二的值。
注意:Symbol函數的參數隻是表示對目前Symbol值的描述,是以相同參數的Symbol函數的傳回值是不相等的。
// 沒有參數的情況
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有參數的情況
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
作為屬性的Symbol
三種寫法:
var mySymbol = Symbol();
// 第一種寫法
var a = {};
a[mySymbol] = 'Hello!';
// 第二種寫法
var a = {
[mySymbol]: 'Hello!'
};
// 第三種寫法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上寫法都得到同樣結果
a[mySymbol] // "Hello!"
注意,Symbol值作為對象屬性名時,不能用點運算符。
Symbol屬性名的周遊
Object.getOwnPropertySymbols方法,可以擷取指定對象的所有Symbol屬性名。
Reflect.ownKeys方法可以傳回所有類型的鍵名,包括正常鍵名和Symbol鍵名。
Symbol.for(),Symbol.keyFor()
Symbol.for(key): 傳回一個命名為key的Symbol值,如果沒有則建立。可使不同變量使用同一個Symbol
Symbol.keyFor(value): for的逆操作
Set和Map資料類型
Set
概念:類似數組,但是沒有重複的值
初始化: new Set([1,2,3,4,4])
注意:在Set内部,兩個NaN是相等。而兩個空對象不相等,是以它們被視為兩個值。
set的屬性和方法
Set.prototype.constructor
Set.prototype.size // 擷取成員總數
執行個體方法:
1.操作方法
add():添加某個值,傳回Set結構本身。
delete():删除某個值,傳回一個布爾值,表示删除是否成功。
has():傳回一個布爾值,表示該值是否為Set的成員。
clear():清除所有成員,沒有傳回值。
2.周遊方法
keys():傳回鍵名的周遊器
values():傳回鍵值的周遊器
entries():傳回鍵值對的周遊器
forEach():使用回調函數周遊每個成員
WeakSet
概念:也是set資料類型,但是成員隻能是對象
特點:無法引用WeakSet的成員,是以WeakSet是不可周遊的
Map
概念:類似對象,但是鍵不限于字元串
初始化:new Map(Object or Array) Object或Array必須是形似鍵值對集合的
var map = new Map([['name', '張三'], ['title', 'Author']]);
map.size // 2
map.has('name') // true
map.get('name') // "張三"
map.has('title') // true
map.get('title') // "Author"
Map屬性和方法:
size屬性:傳回Map結構的成員總數。
1.操作方法:
set(key, value):設定鍵值對
get(key):擷取對應鍵的值
has(key):是否有對應鍵
delete(key):删除對應鍵
clear():清除所有成員
需要特别注意的是,Map的周遊順序就是插入順序。
問題:map要使用數組的方法怎麼用更友善?
let map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
WeakMap
概念:也是Map資料類型,但是成員隻能是對象
特點:鍵名所指向的對象,不計入垃圾回收機制
WeakMap與Map在API上的差別:
一是沒有周遊操作(即沒有key()、values()和entries()方法),也沒有size屬性;
二是無法清空,即不支援clear方法。這與WeakMap的鍵不被計入引用、被垃圾回收機制忽略有關。
是以,WeakMap隻有四個方法可用:get()、set()、has()、delete()。
Iterator
概念:
1.适用對象:Array、Map、Set、某些類似數組的Object
2.作用
Iterator的作用有三個:
一是為各種資料結構,提供一個統一的、簡便的通路接口;
二是使得資料結構的成員能夠按某種次序排列;
三是ES6創造了一種新的周遊指令for...of循環,Iterator接口主要供for...of消費。
凡是部署了Symbol.iterator屬性的資料結構,就稱為部署了周遊器接口。
一個資料結構隻要具有Symbol.iterator屬性,就可以認為是“可周遊的”(iterable)。
調用場合
1.解構指派
2.擴充運算符
3.yield
4.是以任何接受數組作為參數的場合,其實都調用了周遊器接口。
字元串的Iterator
for...of
周遊擁有Iterator接口的集合
适用範圍:數組、Set和Map結構、某些類似數組的對象(比如arguments對象、DOM NodeList對象)、後文的Generator對象,以及字元串。
for...in循環有幾個缺點:
1.數組的鍵名是數字,但是for...in周遊會轉化成字元串
2.不止周遊自身,還會周遊原型鍊上的屬性
3.某些情況下,會以任意順序周遊