1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

edit symbol

This commit is contained in:
ruanyf 2015-09-10 08:51:40 +08:00
parent 79b1d30404
commit 3150ae90fe
2 changed files with 14 additions and 13 deletions

View File

@ -130,6 +130,7 @@
- Luke Hoban, [Async Functions for ECMAScript](https://github.com/lukehoban/ecmascript-asyncawait): Async函数的设计思想与Promise、Gernerator函数的关系 - Luke Hoban, [Async Functions for ECMAScript](https://github.com/lukehoban/ecmascript-asyncawait): Async函数的设计思想与Promise、Gernerator函数的关系
- Jafar Husain, [Asynchronous Generators for ES7](https://github.com/jhusain/asyncgenerator): Async函数的深入讨论 - Jafar Husain, [Asynchronous Generators for ES7](https://github.com/jhusain/asyncgenerator): Async函数的深入讨论
- Nolan Lawson, [Taming the asynchronous beast with ES7](http://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html): async函数通俗的实例讲解 - Nolan Lawson, [Taming the asynchronous beast with ES7](http://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html): async函数通俗的实例讲解
- Axel Rauschmayer, [ES6 generators in depth](http://www.2ality.com/2015/03/es6-generators.html): Generator规格的详尽讲解
## Class ## Class

View File

@ -6,7 +6,7 @@ ES5的对象属性名都是字符串这容易造成属性名的冲突。比
ES6引入了一种新的原始数据类型Symbol表示独一无二的值。它是JavaScript语言的第七种数据类型前六种是Undefined、Null、布尔值Boolean、字符串String、数值Number、对象Object ES6引入了一种新的原始数据类型Symbol表示独一无二的值。它是JavaScript语言的第七种数据类型前六种是Undefined、Null、布尔值Boolean、字符串String、数值Number、对象Object
Symbol值通过Symbol函数生成。这就是说对象的属性名现在可以有两种类型一种是原来就有的字符串另一种就是新增的Symbol类型。凡是属性名属于Symbol类型就都是独一无二的可以保证不会与其他属性名产生冲突。 Symbol值通过`Symbol`函数生成。这就是说对象的属性名现在可以有两种类型一种是原来就有的字符串另一种就是新增的Symbol类型。凡是属性名属于Symbol类型就都是独一无二的可以保证不会与其他属性名产生冲突。
```javascript ```javascript
let s = Symbol(); let s = Symbol();
@ -15,9 +15,9 @@ typeof s
// "symbol" // "symbol"
``` ```
上面代码中变量s就是一个独一无二的值。typeof运算符的结果表明变量s是Symbol数据类型而不是字符串之类的其他类型。 上面代码中,变量`s`就是一个独一无二的值。`typeof`运算符的结果,表明变量`s`是Symbol数据类型而不是字符串之类的其他类型。
注意Symbol函数前不能使用new命令否则会报错。这是因为生成的Symbol是一个原始类型的值不是对象。也就是说由于Symbol值不是对象所以不能添加属性。基本上它是一种类似于字符串的数据类型。 注意Symbol函数前不能使用`new`命令否则会报错。这是因为生成的Symbol是一个原始类型的值不是对象。也就是说由于Symbol值不是对象所以不能添加属性。基本上它是一种类似于字符串的数据类型。
Symbol函数可以接受一个字符串作为参数表示对Symbol实例的描述主要是为了在控制台显示或者转为字符串时比较容易区分。 Symbol函数可以接受一个字符串作为参数表示对Symbol实例的描述主要是为了在控制台显示或者转为字符串时比较容易区分。
@ -32,7 +32,7 @@ s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)" s2.toString() // "Symbol(bar)"
``` ```
上面代码中s1和s2是两个Symbol值。如果不加参数它们在控制台的输出都是`Symbol()`,不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。 上面代码中,`s1``s2`是两个Symbol值。如果不加参数它们在控制台的输出都是`Symbol()`,不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪一个值。
注意Symbol函数的参数只是表示对当前Symbol值的描述因此相同参数的Symbol函数的返回值是不相等的。 注意Symbol函数的参数只是表示对当前Symbol值的描述因此相同参数的Symbol函数的返回值是不相等的。
@ -50,7 +50,7 @@ var s2 = Symbol("foo");
s1 === s2 // false s1 === s2 // false
``` ```
上面代码中s1和s2都是Symbol函数的返回值而且参数相同但是它们是不相等的。 上面代码中,`s1``s2`都是Symbol函数的返回值而且参数相同但是它们是不相等的。
Symbol值不能与其他类型的值进行运算会报错。 Symbol值不能与其他类型的值进行运算会报错。
@ -109,7 +109,7 @@ a[mySymbol] // undefined
a['mySymbol'] // "Hello!" a['mySymbol'] // "Hello!"
``` ```
上面代码中因为点运算符后面总是字符串所以不会读取mySymbol作为标识名所指代的那个值导致a的属性名实际上是一个字符串而不是一个Symbol值。 上面代码中,因为点运算符后面总是字符串,所以不会读取`mySymbol`作为标识名所指代的那个值,导致`a`的属性名实际上是一个字符串而不是一个Symbol值。
同理在对象的内部使用Symbol值定义属性时Symbol值必须放在方括号之中。 同理在对象的内部使用Symbol值定义属性时Symbol值必须放在方括号之中。
@ -123,9 +123,9 @@ let obj = {
obj[s](123); obj[s](123);
``` ```
上面代码中如果s不放在方括号中该属性的键名就是字符串s而不是s所代表的那个Symbol值。 上面代码中,如果`s`不放在方括号中,该属性的键名就是字符串`s`,而不是`s`所代表的那个Symbol值。
采用增强的对象写法上面代码的obj对象可以写得更简洁一些。 采用增强的对象写法,上面代码的`obj`对象可以写得更简洁一些。
```javascript ```javascript
let obj = { let obj = {
@ -149,9 +149,9 @@ log(log.levels.INFO, 'info message');
## 属性名的遍历 ## 属性名的遍历
Symbol作为属性名该属性不会出现在for...in、for...of循环中也不会被`Object.keys()``Object.getOwnPropertyNames()`返回。但是它也不是私有属性有一个Object.getOwnPropertySymbols方法可以获取指定对象的所有Symbol属性名。 Symbol作为属性名该属性不会出现在`for...in``for...of`循环中,也不会被`Object.keys()``Object.getOwnPropertyNames()`返回。但是,它也不是私有属性,有一个`Object.getOwnPropertySymbols`方法可以获取指定对象的所有Symbol属性名。
Object.getOwnPropertySymbols方法返回一个数组成员是当前对象的所有用作属性名的Symbol值。 `Object.getOwnPropertySymbols`方法返回一个数组成员是当前对象的所有用作属性名的Symbol值。
```javascript ```javascript
var obj = {}; var obj = {};
@ -167,7 +167,7 @@ objectSymbols
// [Symbol(a), Symbol(b)] // [Symbol(a), Symbol(b)]
``` ```
下面是另一个例子Object.getOwnPropertySymbols方法与for...in循环、Object.getOwnPropertyNames方法进行对比的例子。 下面是另一个例子,`Object.getOwnPropertySymbols`方法与`for...in`循环、`Object.getOwnPropertyNames`方法进行对比的例子。
```javascript ```javascript
var obj = {}; var obj = {};
@ -189,9 +189,9 @@ Object.getOwnPropertySymbols(obj)
// [Symbol(foo)] // [Symbol(foo)]
``` ```
上面代码中使用Object.getOwnPropertyNames方法得不到Symbol属性名需要使用Object.getOwnPropertySymbols方法。 上面代码中,使用`Object.getOwnPropertyNames`方法得不到`Symbol`属性名,需要使用`Object.getOwnPropertySymbols`方法。
另一个新的APIReflect.ownKeys方法可以返回所有类型的键名包括常规键名和Symbol键名。 另一个新的API`Reflect.ownKeys`方法可以返回所有类型的键名包括常规键名和Symbol键名。
```javascript ```javascript
let obj = { let obj = {