es6之 Symbol筆記
阿新 • • 發佈:2018-12-07
#### Symbol
1. 它是一種新的原始資料型別,es6中有其中資料型別分別是:
- boolean
- undefined
- null
- 字串
- 數值
2.目的:保證每個屬性的名字都是獨一無二的,從根本上防止屬性名的衝突;
3.Symbol值通過symbol函式生成,這樣物件的屬性名可以有兩種型別,一種是字串,另一種是symbol型別,凡是symbol型別的,就都是獨一無二的,可以保證不會與其他屬性名產生衝突;
4.由於每一個Symbol值都不相等,所以可以用它做識別符號,從而保證不會出現同名的屬性,
- Symbol 值作為物件屬性名時,不能用點運算子,點運算子後跟的是字串。
- 在物件的內部,使用 Symbol值定義屬性時,Symbol 值必須放在方括號之中。
```javascript
let mySymbol = symbol();
//第一種寫法
let a = {}
a[mySymbol] = "hello"
//第二種寫法
let a ={
[mySymbol] = "hello"
}
//第三種寫法
let a = {}
a.defineProperty(a,mySymbol,{value:'hello'});
//以上寫法都可以得到同樣的結果
a[mySymbol] //"hello"
```
5、可以消除魔法字串(指在程式碼中多次出現、與程式碼形成強耦合的某一個具體的字串或者數值,應儘量使用變數代替)
6、Symbol 作為屬性名,該屬性不會出現在for...in、for...of迴圈中,也不會被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有屬性,有一個Object.getOwnPropertySymbols方法,可以獲取指定物件的所有 Symbol 屬性 名。
7、另一個新的 API,Reflect.ownKeys方法可以返回所有型別的鍵名,包括常規鍵名和 Symbol 鍵名。
```javascript
let obj = {
[Symbol('my_key')]:1,
enum : 2,
nonEnum : 3
};
Reflect.ownKeys(obj);//[symbol('my_key'),"enum","nonEnum"]
```
8、Symbol的一些方法
- Symbol.for();
```
let a = Symbol.for('foo');
let b = Symbol.for('foo');
a===b //true
```
- Symbol.keyFor();返回一個已登記的Symbol型別值的key
```
let a = Symbol.for('foo');
Symbol.keyFor(a);//'foo'
let b = Symbol.for('foo');
Symbol.keyFor(b);//undefined,b屬於未登記的symbol值
```
9、es6提供了11個內建的Symbol值
- Symbol.hasInstance
- Symbol.isConcatSpreadable
- Symbol.species
- Symbol.match
- Symbol.replace
- Symbol.search
- Symbol.split
- Symbol.iterator
- Symbol.toPrimitive
- Symbol.toStringTag
- Symbol.unscopables
1. 它是一種新的原始資料型別,es6中有其中資料型別分別是:
- boolean
- undefined
- null
- 字串
- 數值
- 物件
-symbol
2.目的:保證每個屬性的名字都是獨一無二的,從根本上防止屬性名的衝突;
3.Symbol值通過symbol函式生成,這樣物件的屬性名可以有兩種型別,一種是字串,另一種是symbol型別,凡是symbol型別的,就都是獨一無二的,可以保證不會與其他屬性名產生衝突;
4.由於每一個Symbol值都不相等,所以可以用它做識別符號,從而保證不會出現同名的屬性,
- Symbol 值作為物件屬性名時,不能用點運算子,點運算子後跟的是字串。
- 在物件的內部,使用 Symbol值定義屬性時,Symbol 值必須放在方括號之中。
```javascript
let mySymbol = symbol();
//第一種寫法
let a = {}
a[mySymbol] = "hello"
//第二種寫法
let a ={
[mySymbol] = "hello"
}
//第三種寫法
let a = {}
a.defineProperty(a,mySymbol,{value:'hello'});
//以上寫法都可以得到同樣的結果
a[mySymbol] //"hello"
```
5、可以消除魔法字串(指在程式碼中多次出現、與程式碼形成強耦合的某一個具體的字串或者數值,應儘量使用變數代替)
6、Symbol 作為屬性名,該屬性不會出現在for...in、for...of迴圈中,也不會被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。但是,它也不是私有屬性,有一個Object.getOwnPropertySymbols方法,可以獲取指定物件的所有 Symbol 屬性
7、另一個新的 API,Reflect.ownKeys方法可以返回所有型別的鍵名,包括常規鍵名和 Symbol 鍵名。
```javascript
let obj = {
[Symbol('my_key')]:1,
enum : 2,
nonEnum : 3
};
Reflect.ownKeys(obj);//[symbol('my_key'),"enum","nonEnum"]
```
8、Symbol的一些方法
- Symbol.for();
```
let a = Symbol.for('foo');
let b = Symbol.for('foo');
a===b //true
```
- Symbol.keyFor();返回一個已登記的Symbol型別值的key
```
let a = Symbol.for('foo');
Symbol.keyFor(a);//'foo'
let b = Symbol.for('foo');
Symbol.keyFor(b);//undefined,b屬於未登記的symbol值
```
9、es6提供了11個內建的Symbol值
- Symbol.hasInstance
- Symbol.isConcatSpreadable
- Symbol.species
- Symbol.match
- Symbol.replace
- Symbol.search
- Symbol.split
- Symbol.iterator
- Symbol.toPrimitive
- Symbol.toStringTag
- Symbol.unscopables