ES6里老生常谈的var,let,const到底有什么区别呢?五分钟速览

117 阅读1分钟

我正在参加「掘金·启航计划」

总结

关键词块级作用域变量提升全局属性重复声明暂时性死区必须赋初值能否修改值
var×××
let××××
const××××

变量提升

只有var具有变量提升 (不管在在一个作用域内何处定义变量,都会将此变量提升至作用域的顶部,但不会包括已赋的初值)

{
    console.log(e)
    var e = 3
}

这段代码在一个块级作用域内声明了e变量,通过变量提升,将会使得变量被提升到作用域的顶端,但值不会,所以结果为

undefined

若将声明换成let\const e =3,结果为

Uncaught ReferenceError: e is not defined

作用域

let\const是块级作用域,而var是全局或者上下文作用域,看下面的代码

let arr = []
for (var i = 0; i < 2; i++) {
    arr[i] = function (){
        console.log(i)
    }
}
arr[0]()
arr[1]()

输出为

2
2

为什么呢?原因是var的作用域为全局,所以当arr[0/1]()执行匿名函数时,找到的是全局级别的i,此时经过for循环i的值已经变为了2,所以输出都为2

var换成let

let arr = []
for (let i = 0; i < 2; i++) {
    arr[i] = function (){
        console.log(i)
    }
}
arr[0]()
arr[1]()

输出结果如下

0
1

let的作用域为块级,在这里就是for循环,所以在作用域结束后,值也对应的绑定上了

重复声明

var a = 1
var a = 2
console.log(a)

var支持重复声明,他会覆盖已声明变量的值,但在同一作用域内,let\const不支持重复声明

var a = 1
var a = 2
let a = 3

console.log(a)

这样将会得到SyntaxError: Identifier 'a' has already been declared ,而如果给let放在另一个块级作用域内,又将会是合法的

var a = 1
var a = 2
{
    let a = 3
}

console.log(a)

暂时性死区

简单来讲,就是在let\const变量声明前,不能使用他们,否则将会得到一个报错,比如

console.log(a)
let a = 3

结果就是

e is not defined

const

constlet一样,具有绝大多数相同的属性,但const是用来定义常量的,类似于Java中的final等等,是在定义后不能更改值的,所以必须赋初值

const又能更改"值",这是为什么呢?

const固定基本类型的值与引用类型的内存地址

如下

const a = 3
//a = 4  不能修改基本类型的值
const b = {name: "Z",age: 20}
b.name = "A" //可以修改引用类型的值
//b = {name: "C",age: 10} 不能修改内存地址

以上就是本篇文章的全部内容,希望大家能有所收获