1. 程式人生 > >es6之 Symbol筆記

es6之 Symbol筆記

#### Symbol

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