1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-28 13:02:21 +00:00

docs(let): edit const

This commit is contained in:
ruanyf 2017-02-24 21:38:18 +08:00
parent 002618ac5e
commit 9bb12ab3d2

View File

@ -179,7 +179,7 @@ ES6规定暂时性死区和`let`、`const`语句不出现变量提升,主要
### 不允许重复声明
let不允许在相同作用域内重复声明同一个变量。
`let`不允许在相同作用域内,重复声明同一个变量。
```javascript
// 报错
@ -230,7 +230,7 @@ function f() {
f(); // undefined
```
上面代码中函数f执行后输出结果为`undefined`原因在于变量提升导致内层的tmp变量覆盖了外层的tmp变量。
上面代码中,函数`f`执行后,输出结果为`undefined`,原因在于变量提升,导致内层的`tmp`变量覆盖了外层的`tmp`变量。
第二种场景,用来计数的循环变量泄露为全局变量。
@ -244,7 +244,7 @@ for (var i = 0; i < s.length; i++) {
console.log(i); // 5
```
上面代码中变量i只用来控制循环但是循环结束后它并没有消失泄露成了全局变量。
上面代码中,变量`i`只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
### ES6的块级作用域
@ -496,7 +496,7 @@ PI = 3;
上面代码表明改变常量的值会报错。
`const`声明的变量不得改变值这意味着const一旦声明变量就必须立即初始化不能留到以后赋值。
`const`声明的变量不得改变值,这意味着,`const`一旦声明变量,就必须立即初始化,不能留到以后赋值。
```javascript
const foo;
@ -537,15 +537,16 @@ const message = "Goodbye!";
const age = 30;
```
对于复合类型的变量,变量名不指向数据,而是指向数据所在的地址。`const`命令只是保证变量名指向的地址不变,并不保证该地址的数据不变,所以将一个对象声明为常量必须非常小心。
`const`实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,`const`只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
```javascript
const foo = {};
// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123
foo.prop
// 123
// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
```
@ -553,7 +554,7 @@ foo = {}; // TypeError: "foo" is read-only
下面是另一个例子。
```js
```javascript
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行