9.3 const 创建不可变的变量
let 创建的变量是可变的:
let foo = 'abc';
foo = 'def';
console.log(foo); // def
常量通过 const 创建,是不可变的 - 不能重新赋值:
const foo = 'abc';
foo = 'def'; // TypeError
9.3.1 陷阱: const 不能确保值不可变
const 仅仅意味着变量总是有相同的值,但是不能确保可变的值不可变。例如, obj 是一个常量,但是它指向的值是可变的 - 我们能增加一个属性给它:
const obj = {};
obj.prop = 123;
console.log(obj.prop); // 123
然而,我们不能重新分配一个不同的值给 obj:
obj = {}; // TypeError
如果你想让 obj 不可变,你必须做一些处理,例如冻结对象:
const obj = Object.freeze({});
obj.prop = 123; // TypeError
9.3.2 循环体中的 const
const 变量一旦被创建, 它就不能被改变。 但是这并不是意味着你不能通过循环重新进入它的作用域并且赋值重新执行:
function logArgs(...args) {
    for (let [index, elem] of args.entries()) {
        const message = index + '. ' + elem;
        console.log(message);
    }
}
logArgs('Hello', 'everyone');
// Output:
// 0. Hello
// 1. everyone