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



猜你喜欢

转载自blog.csdn.net/Alexbyy/article/details/79473007