ES6學習筆記(三):與迭代相關的新東東

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值做爲對象屬性名時,不能用點運算符。prototype

Symbol屬性名的遍歷

Object.getOwnPropertySymbols方法,能夠獲取指定對象的全部Symbol屬性名。
Reflect.ownKeys方法能夠返回全部類型的鍵名,包括常規鍵名和Symbol鍵名。code

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():清除全部成員

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

須要特別注意的是,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.某些狀況下,會以任意順序遍歷

相關文章
相關標籤/搜索