• 常量和块作用域变量
    • Const对象字面量
    • 对象的Const引用

    常量和块作用域变量

    ES6引入了块范围的概念。 块范围界定对来自其他语言(如C,Java或甚至PHP)的程序员来说是熟悉的。
    在ES5 JavaScript和更早版本中,var的作用域是函数,它们可以在外部上下文中“看到”它们的函数。

    1. var five = 5;
    2. var threeAlso = three; // error
    3. function scope1() {
    4. var three = 3;
    5. var fiveAlso = five; // == 5
    6. var sevenAlso = seven; // error
    7. }
    8. function scope2() {
    9. var seven = 7;
    10. var fiveAlso = five; // == 5
    11. var threeAlso = three; // error
    12. }

    ES5中的函数本质上是可以在外面“看到”,但不能进入的容器。
    在ES6中,var仍然以这种方式工作,使用函数作为容器,但有两种新的方法来声明变量:constlet
    constlet使用{}块作为容器,故称为“块作用域”。 块作用域在循环期间非常有用。 考虑以下代码:

    1. var i;
    2. for (i = 0; i < 10; i += 1) {
    3. var j = i;
    4. let k = i;
    5. }
    6. console.log(j); // 9
    7. console.log(k); // undefined

    尽管引入块作用域,函数仍然是处理大多数循环的首选机制。

    let工作类似var在其数据读/写的意义。 let在用于for循环时也很有用。 例如,不使用let ,以下示例将输出5,5,5,5,5

    1. for(var x=0; x<5; x++) {
    2. setTimeout(()=>console.log(x), 0)
    3. }

    但是, 当我们使用 let 代替 var ,值回按我们希望的方式在限制的作用域内。

    1. for(let x=0; x<5; x++) {
    2. setTimeout(()=>console.log(x), 0)
    3. }

    此外,const是只读的。一旦const被分配,标识符不能被重新分配。 例如:

    1. const myName = 'pat';
    2. let yourName = 'jo';
    3. yourName = 'sam'; // assigns
    4. myName = 'jan'; // error

    只读性质可以用任何对象来演示:

    1. const literal = {};
    2. literal.attribute = 'test'; // fine
    3. literal = []; // error;

    但是有两种情况,const不会像你想象的那样工作。

    1. 一个const对象字面量
    2. 对对象的const引用。

    Const对象字面量

    1. const person = {
    2. name: 'Tammy'
    3. };
    4. person.name = 'Pushpa'; // OK, name property changed.
    5. person = null; // "TypeError: Assignment to constant variable.

    上面的示例演示了我们能够更改person对象的name属性,但是我们无法重置person的引用,因为它已标记为const

    对象的Const引用

    类似上面的代码是使用const引用,下面我们切换到使用let创建源文本(literal)对象。

    1. let person = {
    2. name: 'Tammy'
    3. };
    4. const p = person;
    5. p.name = 'Pushpa'; // OK, name property changed.
    6. p = null; // "TypeError: Assignment to constant variable.

    标记一个对象的引用为const不会让对象里的属性也为const。

    MDN:const