ES6之let和const

在ES5中,我们使用var声明变量,很方便,但有时候,我们想声明一些变量用作配置,不想被后续的逻辑代码改变。这个时候就需要声明一个常量了。

let特性

1. let是块级作用域,即在一组大括号中

  • if(){}
  • function(){}
  • for(){}
  • {}

 

2. let在同一作用域中不能重复定义,但可以重复赋值

{
    let a = 1;
    let a = 2;   // !报错
    a = 2;  // 可以重复赋值
    {
        let a = 3;  // 可以,因为在新的块级作用域中了
    }
}

 

3. let没有变量提升,必须先定义,再使用,否则报错

// 使用var声明时,变量是可以提升预解析的,先使用再声明,只会报未赋值undefined
function aa() {
    console.log(a); // undefined
    var a = 2;
}

// 使用let声明,变量不会提升
function bb() {
    console.log(a); // a is not defined 报错
    let a = 2;
}

 

 

4. 特殊块级for

先看一段代码

for (let i = 0; i < 3; i += 1;) {
    let i = 2;
    console.log(i);
}

// 2 出现3次

同一块级作用域是不能重复用let声明的,但这里却可以。这是因为for的条件 和 for的执行区 是父子块级作用域的关系。

 

 

const特性

1. const用来声明常量,声明时就得赋值

{
    const a; // 报错,声明需要马上赋值
    a = 2; // 报错,不能改变值
}

 

 

2. const和let一样,也是块级作用域,没有变量提升

 

 

3. “真正的”常量

即使用了const 定义了一个数组或对象,那么后续还是可以改变数组的元素或改变对象的属性和方法。如果真的不想被后续业务代码改变影响,那可以使用Object提供的freeze方法,冻结数组或对象

const config = {
    title: 'aaa',
    brand: 'bbb'
};
Object.freeze(config);  // 冻结config

config.title = 'ccc'; // 报错,因为被冻结了

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注