ES6 - let和const

145 阅读2分钟

概述

  • 在ES6之前,我们定义变量都是使用var,使用var会存在变量提升的现象。
  • ES6中提出了新的声明变量的方式,let和const,这两个不会存在变量提升的现象。

let和const共同特性

let和const都一样的就有一个却别,共同特性使用const演示

  • 块级作用:在代码块之外不可使用
if(true) {
    const a = 1;
}
console.log(a)     // 报错
  • 暂时性死区:不允许在声明之前使用
console.log(a);    // 报错
const a = 1;
  • 不允许重复声明:声明同名的变量会报错
const a = 1;
const a = 2;       // 报错
  • 不进行全局挂载:全局定义的变量不再作为属性添加到全局对象中
const a = 1;
window.a;         // undefined

let用法

概述: var怎么使用let就怎么使用,只不过是拥有上面说的特性

拥有块级作用,有了这个可以解决我们的一个经典问题。问题是:如何在一秒钟以后输出0 ~ 9?

以前的解法:需要使用一个立即执行函数来存储一下当前的变量i

for(var i = 0; i < 10; i ++) {
    (function (i) {
        setTimeout(function () {
            console.log(i)
        }, 1000)
    }(i))
}

现在的做法:就是用let就完事了,比上面的要简洁的多

for(let i = 0; i < 10; i ++) {
    setTimeout(function () {
        console.log(i);
    }, 1000)
}

const(常量)用法

const跟let基本一摸一样,只有两个个区别

  • const在定义变量的时候必须初始化(赋值)
const a;        // 报错
const a = 1;    // 必须在定义变量的时候赋值
  • const定义了以后就不能更改(不能重新赋值)
const a = 1;
a = 2;          // 报错

我们定义的这个变量是一个对象时 你就会发现还是能改变里面的值的,如下

// 以下代码时不会报错的
var obj = {
    age = 17;
}
obj.age = 18;

那么为什么会这样子呢,不能改变指的是不能改变这个常量obj的值,上面obj的值是这个对象的一个地址,我通过这个地址改了obj对象里面的东西,跟这个常量obj没有半毛钱关系。

如果是下面这种方式就不行,因为是给它重新赋值了

obj = { name = 18; }    // 报错