一、Symbol
應用場景:因為每一個 Symbol 的值都是不相等的,所以 Symbol 作為對象的屬性名,可以保證屬性不重名。
1.1. 什么是Symbol ?
1.1.1. Symbol是ES6中新增的原始數據類型,Symbol提供一種獨一無二的值
比如:在js中聲明一個變量a = 5;再聲明一個變量b = 5; 雖然這兩個變量名不同,但是值是相等的;使用Symbol聲明的值不重復、不相等。
1.2. 如何使用Symbol。
1 //兩個不同變量名的值是相等的
2 let a = 1; 3 let b = 1; 4 console.log(a===b);//true 5
6 //如何使用Symbol聲明一個獨一無二的值
7 let c = Symbol('abc'); 8 let d = Symbol('abc'); 9 console.log(c===d);//false
1.3. Symbol.for()方法的使用
Symbol.for()方法:不同的變量,可以使用同一個Symbol值,Symbol.for()方法接收一個參數,然后查找是否有以該參數作為名稱的Symbol值,如果有就返回這個Symbol值,否則就新建一個以該參數為名稱的Symbol值。
1 //Symbol.for()方法的使用
2 let a = Symbol.for('abc'); 3 let b = Symbol.for('abc'); 4 console.log(a===b)//true
1.4. Symbol.keyFor()方法的使用
Symbol.keyFor() 返回一個已使用的 Symbol 類型值的key,用來檢測該參數作為名稱的 Symbol 值是否已被使用
1 //Symbol.keyFor()方法的使用
2 let a = Symbol.for('abc'); 3 let b = Symbol.keyFor(a); 4 console.log(b);// abc
1.5. Symbol的應用場景:
作為對象的屬性名
1 let a = Symbol.for('abc'); 2
3 let obj = { 4 [a]:123, 5 b:456
6 } 7 console.log(obj);//{b: 456, Symbol(abc): 123}
1.6. Symbol屬性名獲取值
當Symbol值為對象的屬性名時,使用普通的遍歷方法 比如: entries()方法是獲取不到Symbol屬性名的。
Object.getOwnPropertySymbols()方法:接收一個對象參數,返回一個數組,只能獲取到Symbol類型的屬性名,普通的屬性名獲取不到。
Reflect.ownKeys()方法:同樣也是接收一個對象參數,返回一個數組,不同的是:能獲取對象中所有的屬性名和所對應的值,包括Symbol變量的屬性名。
兩種遍歷方法的使用:
1 let a = Symbol.for('abc'); 2 3 let obj = { 4 [a]:123, 5 def:456 6 } 7 8 //Object.getOwnPropertySymbols()方法的使用 9 let arr = Object.getOwnPropertySymbols(obj); 10 console.log(arr);// [Symbol(abc)] 11 arr.forEach(item =>{ 12 //輸出屬性名和屬性值 13 console.log(item,obj[item]);//鍵(key):Symbol(abc) 值(value):123 14 }) 15 16 //Reflect.ownKeys()方法的使用 17 let arr2 = Reflect.ownKeys(obj); 18 console.log(arr2);// ["def", Symbol(abc)] 19 arr2.forEach(item =>{ 20 //輸出屬性名和屬性值 21 console.log(item , obj[item]);// def 456 | Symbol(abc) 123 22 })
二、Iterator迭代器的使用
2.1. Iterator是一個統一的接口,它的作用是使各種 可遍歷的數據結構 能夠被便捷的訪問,它是通過一個鍵為Symbol.iterator 的方法來實現。
2.2. 使用Symbol.iterator()r遍歷集合:
Symbol.iterator()方法返回一個對象,該對象有一個 next() 方法用於返回當前位置的對象,每個對象有兩個key選項,分別是 value 和 done 。value對應的值是當前屬性的值,done則表示是否遍歷結束 ,done 的值為 true 時表示遍歷結束。
1 let arr = [1,2,3]; 2 let map = arr[Symbol.iterator](); 3 console.log(map.next());//{value: 1, done: false}
4 console.log(map.next());//{value: 2, done: false}
5 console.log(map.next());//{value: 3, done: false}
6 console.log(map.next());//{value: undefined, done: true}
