Skip to content

let、const、var

1.var

Es6之前我们都使用var来声明变量,但是var声明的变量都会进行一个变量提升,也就是都挂载到了window这个对象身上

js
var num = 111
var num2 = 222
console.log(window.num)		// 111
console.log(window.num2)		// 222

这样所有的变量都在一个作用域,会引发很多问题,开发中尽量不使用var

2.let

letEs6的一个新修饰符,也是用来声明变量,let有以下特点:

  1. let用于声明变量

    js
    let num = 11
    num=222
  2. let不允许重复声明相同名称的变量

    js
    let num = 11
    let num = 22		// 错误
  3. let声明的变量不会在预解析的时候解析,也就是不会变量提升

    js
    let num = 11
    console.log(window.num)		// undefined
    
    function test() {
        let num = 22
        console.log(window.num) // undefined
    }
  4. let声明的变量,所有代码块都会限制其作用域

    js
    let num = 11
    const fn = () => {
        let num = 22
        console.log(num)	// 22
    }
    
    console.log(num)	// 11

3.const

constEs6的一个新修饰符,也是用来声明常量const有以下特点:

  1. const用来声明常量,也就是不可变的量

    js
    const num = 666
    num = 777		// error: Assignment to constant variable.  常量不可修改
  2. const声明的常量必须有初始值

    js
    const num 		// error:'const' declarations must be initialized. 常量必须有初始值
  3. const不可重复声明相同名称的常量

    js
    const num=666
    const num=777		// error: Identifier 'num' has already been declared  num已被定义
  4. const声明的常量,所有代码块都会限制其作用域

    js
    const num = 11
    const fn = () => {
        const num = 22
        console.log(num)	// 22
    }
    
    console.log(num)	// 11

注意

const声明基本数据类型时,常量的值不可改变

但是声明复杂数据类型时,却可以修改里面数据的值

js
const obj = {
    num: 111,
}
console.log(obj.num)	// 111
obj.num = 222
console.log(obj.num)	// 222

但是直接修改复杂数据本身也是不行的

js
const obj = {
    num: 111,
}
obj = {}  // err 常量不可修改

这是因为声明复杂数据类型时,栈中存储的是数据的堆地址,内部的数据都存储在堆中

const的本质是不可修改其在栈中存储的数据

4.let和const

4.1 共同点

let和const有以下共同点:

  • let和const都不可重复声明变量
  • let和const声明的变量都不会变量提升
  • let和const都会被代码块限制作用范围

4.2 不同点

let和const有以下不同点:

  • let声明的变量可以没有初始值,const声明的常量必须有初始值
  • let声明的变量可以修改,const声明的常量不可修改

MIT Licensed