Skip to content

Commit

Permalink
Merge pull request #1 from ruanyf/gh-pages
Browse files Browse the repository at this point in the history
Update 18.01.04
  • Loading branch information
picc-lu committed Jan 4, 2018
2 parents 0051af0 + 1335934 commit 091a121
Show file tree
Hide file tree
Showing 5 changed files with 36 additions and 11 deletions.
2 changes: 1 addition & 1 deletion docs/array.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const arr = [
// [1]
```

### 替代数组的 apply 方法
### 替代函数的 apply 方法

由于扩展运算符可以展开数组,所以不再需要`apply`方法,将数组转为函数的参数了。

Expand Down
30 changes: 27 additions & 3 deletions docs/class.md
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,9 @@ class Foo {}

上面的代码不会报错,因为`Bar`继承`Foo`的时候,`Foo`已经有定义了。但是,如果存在`class`的提升,上面代码就会报错,因为`class`会被提升到代码头部,而`let`命令是不提升的,所以导致`Bar`继承`Foo`的时候,`Foo`还没有定义。

## 私有方法
## 私有方法和私有属性

### 现有的方法

私有方法是常见需求,但 ES6 不提供,只能通过变通方法模拟实现。

Expand Down Expand Up @@ -441,9 +443,9 @@ export default class myClass{

上面代码中,`bar``snaf`都是`Symbol`值,导致第三方无法获取到它们,因此达到了私有方法和私有属性的效果。

## 私有属性
### 私有属性的提案

与私有方法一样,ES6 不支持私有属性。目前,有一个[提案](https://github.com/tc39/proposal-class-fields#private-fields),为`class`加了私有属性。方法是在属性名之前,使用`#`表示。
与私有方法一样,ES6 不支持私有属性。目前,有一个[提案](https://github.com/tc39/proposal-private-methods),为`class`加了私有属性。方法是在属性名之前,使用`#`表示。

```javascript
class Point {
Expand Down Expand Up @@ -485,6 +487,28 @@ class Foo {
}
```

上面代码中,`#sum()`就是一个私有方法。

另外,私有属性也可以设置 getter 和 setter 方法。

```javascript
class Counter {
#xValue = 0;

get #x() { return #xValue; }
set #x(value) {
this.#xValue = value;
}

constructor() {
super();
// ...
}
}
```

上面代码中,`#x`是一个私有属性,它的读写都通过`get #x()``set #x()`来完成。

## this 的指向

类的方法内部如果含有`this`,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。
Expand Down
10 changes: 5 additions & 5 deletions docs/destructuring.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ let [x, y = 'b'] = ['a']; // x='a', y='b'
let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
```

注意,ES6 内部使用严格相等运算符(`===`),判断一个位置是否有值。所以,如果一个数组成员不严格等于`undefined`默认值是不会生效的
注意,ES6 内部使用严格相等运算符(`===`),判断一个位置是否有值。所以,只有当一个数组成员严格等于`undefined`默认值才会生效

```javascript
let [x = 1] = [undefined];
Expand Down Expand Up @@ -161,10 +161,10 @@ if ([1][0] === undefined) {
let [x = 1, y = x] = []; // x=1; y=1
let [x = 1, y = x] = [2]; // x=2; y=2
let [x = 1, y = x] = [1, 2]; // x=1; y=2
let [x = y, y = 1] = []; // ReferenceError
let [x = y, y = 1] = []; // ReferenceError: y is not defined
```

上面最后一个表达式之所以会报错,是因为`x`用到默认值`y``y`还没有声明。
上面最后一个表达式之所以会报错,是因为`x``y`做默认值时`y`还没有声明。

## 对象的解构赋值

Expand Down Expand Up @@ -310,7 +310,7 @@ var {x = 3} = {x: null};
x // null
```

上面代码中,如果`x`属性等于`null`就不严格相等于`undefined`,导致默认值不会生效
上面代码中,属性`x`等于`null`因为`null``undefined`不严格相等,所以是个有效的赋值,导致默认值`3`不会生效

如果解构失败,变量的值等于`undefined`

Expand Down Expand Up @@ -379,7 +379,7 @@ first // 1
last // 3
```

上面代码对数组进行对象解构。数组`arr``0`键对应的值是`1``[arr.length - 1]`就是`2`键,对应的值是`3`。方括号这种写法,属于“属性名表达式”参见《对象的扩展》一章。
上面代码对数组进行对象解构。数组`arr``0`键对应的值是`1``[arr.length - 1]`就是`2`键,对应的值是`3`。方括号这种写法,属于“属性名表达式”参见《对象的扩展》一章

## 字符串的解构赋值

Expand Down
4 changes: 2 additions & 2 deletions docs/module.md
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ import {crc32} from 'crc32'; // 输入

上面代码的两组写法,第一组是使用`export default`时,对应的`import`语句不需要使用大括号;第二组是不使用`export default`时,对应的`import`语句需要使用大括号。

`export default`命令用于指定模块的默认输出。显然,一个模块只能有一个默认输出,因此`export default`命令只能使用一次。所以,`import`命令后面才不用加大括号,因为只可能对应一个方法
`export default`命令用于指定模块的默认输出。显然,一个模块只能有一个默认输出,因此`export default`命令只能使用一次。所以,import命令后面才不用加大括号,因为只可能唯一对应`export default`命令

本质上,`export default`就是输出一个叫做`default`的变量或方法,然后系统允许你为它取任意名字。所以,下面的写法是有效的。

Expand Down Expand Up @@ -425,7 +425,7 @@ export default var a = 1;

上面代码中,`export default a`的含义是将变量`a`的值赋给变量`default`。所以,最后一种写法会报错。

同样地,因为`export default`本质是将该命令后面的值,赋给`default`变量以后再默认,所以直接将一个值写在`export default`之后。
同样地,因为`export default`命令的本质是将后面的值,赋给`default`变量,所以可以直接将一个值写在`export default`之后。

```javascript
// 正确
Expand Down
1 change: 1 addition & 0 deletions docs/reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@
- Jake Archibald, [Async functions - making promises friendly](https://developers.google.com/web/fundamentals/getting-started/primers/async-functions)
- Axel Rauschmayer, [ES proposal: asynchronous iteration](http://www.2ality.com/2016/10/asynchronous-iteration.html): 异步遍历器的详细介绍
- Dima Grossman, [How to write async await without try-catch blocks in Javascript](http://blog.grossman.io/how-to-write-async-await-without-try-catch-blocks-in-javascript/): 除了 try/catch 以外的 async 函数内部捕捉错误的方法
- Mostafa Gaafa, [6 Reasons Why JavaScript’s Async/Await Blows Promises Away](https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9): Async 函数的6个好处

## Class

Expand Down

0 comments on commit 091a121

Please sign in to comment.