Symbol:一種新的原始數據類型,表示獨一無二的值。數組
注意:Symbol函數的參數只是表示對當前Symbol值的描述,所以相同參數的Symbol函數的返回值是不相等的。數據結構
// 沒有參數的狀況 var s1 = Symbol(); var s2 = Symbol(); s1 === s2 // false // 有參數的狀況 var s1 = Symbol("foo"); var s2 = Symbol("foo"); s1 === s2 // false
三種寫法:函數
var mySymbol = Symbol(); // 第一種寫法 var a = {}; a[mySymbol] = 'Hello!'; // 第二種寫法 var a = { [mySymbol]: 'Hello!' }; // 第三種寫法 var a = {}; Object.defineProperty(a, mySymbol, { value: 'Hello!' }); // 以上寫法都獲得一樣結果 a[mySymbol] // "Hello!"
注意,Symbol值做爲對象屬性名時,不能用點運算符。prototype
Object.getOwnPropertySymbols方法,能夠獲取指定對象的全部Symbol屬性名。
Reflect.ownKeys方法能夠返回全部類型的鍵名,包括常規鍵名和Symbol鍵名。code
Symbol.for(key): 返回一個命名爲key的Symbol值,若是沒有則建立。可以使不一樣變量使用同一個Symbol
Symbol.keyFor(value): for的逆操做對象
概念:相似數組,可是沒有重複的值
初始化: new Set([1,2,3,4,4])接口
注意:在Set內部,兩個NaN是相等。而兩個空對象不相等,因此它們被視爲兩個值。原型鏈
Set.prototype.constructor
Set.prototype.size // 獲取成員總數字符串
實例方法:
1.操做方法
add():添加某個值,返回Set結構自己。
delete():刪除某個值,返回一個布爾值,表示刪除是否成功。
has():返回一個布爾值,表示該值是否爲Set的成員。
clear():清除全部成員,沒有返回值。部署
2.遍歷方法
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調函數遍歷每一個成員
概念:也是set數據類型,可是成員只能是對象
特色:沒法引用WeakSet的成員,所以WeakSet是不可遍歷的
概念:相似對象,可是鍵不限於字符串
初始化: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"
size屬性:返回Map結構的成員總數。
1.操做方法:
set(key, value):設置鍵值對
get(key):獲取對應鍵的值
has(key):是否有對應鍵
delete(key):刪除對應鍵
clear():清除全部成員
2.遍歷方法
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對的遍歷器
forEach():使用回調函數遍歷每一個成員
須要特別注意的是,Map的遍歷順序就是插入順序。
問題:map要使用數組的方法怎麼用更方便?
let map1 = new Map( [...map0].filter(([k, v]) => k < 3) );
概念:也是Map數據類型,可是成員只能是對象
特色:鍵名所指向的對象,不計入垃圾回收機制
WeakMap與Map在API上的區別:
一是沒有遍歷操做(即沒有key()、values()和entries()方法),也沒有size屬性;
二是沒法清空,即不支持clear方法。這與WeakMap的鍵不被計入引用、被垃圾回收機制忽略有關。
所以,WeakMap只有四個方法可用:get()、set()、has()、delete()。
1.適用對象:Array、Map、Set、某些相似數組的Object
2.做用
Iterator的做用有三個:
一是爲各類數據結構,提供一個統一的、簡便的訪問接口;
二是使得數據結構的成員可以按某種次序排列;
三是ES6創造了一種新的遍歷命令for...of循環,Iterator接口主要供for...of消費。
凡是部署了Symbol.iterator屬性的數據結構,就稱爲部署了遍歷器接口。
一個數據結構只要具備Symbol.iterator屬性,就能夠認爲是「可遍歷的」(iterable)。
1.解構賦值
2.擴展運算符
3.yield
4.因此任何接受數組做爲參數的場合,其實都調用了遍歷器接口。
遍歷擁有Iterator接口的集合
適用範圍:數組、Set和Map結構、某些相似數組的對象(好比arguments對象、DOM NodeList對象)、後文的Generator對象,以及字符串。
for...in循環有幾個缺點: 1.數組的鍵名是數字,可是for...in遍歷會轉化成字符串 2.不止遍歷自身,還會遍歷原型鏈上的屬性 3.某些狀況下,會以任意順序遍歷