哈士奇最近了解到es6中更新的let和const两种命名变量的方式,那么为何es6会更新这两种方式呢?它解决了什么问题?它们与var的区别究竟在哪里呢?
let 、const、var的区别
预解析
预解析(变量预解析即变量提升),var所声明的变量是可以进行变量提升的,而let和const则无法达到同样的效果。
console.log(a)
console.log(b)
console.log(c)
var a=1
let b=2
const c=3
这里很明显,在预编译的时候,var声明的a被赋为undefined,然后从b开始便报错。
变量名称重复性
在新的es6中,var声明的变量是可重复的,但是let与const则会报错
var a=1
var a=1
let b=2
let b=2
const c=3
const c=3
console.log(a)
console.log(b)
console.log(c)
vscode已经写明错误,同时在写的过程中已经出现了提示了
变量作用域
var声明变量既可以作为全局作用域也可以作为局部作用域,而const和let声明的变量只能作为局部作用域(块级作用域)
function fn1() {
var a = 0;
let b = 0;
const c=0;
{
var a = 1;
let b = 1;
const c=1;
}
function fn() {
console.log('a:', a)
console.log('b:', b)
console.log('c:', c)
}
fn()
}
fn1()
在这个例子中可以看出来let 和 const声明的作用域都受到块作用域的影响,而var则不受影响,只要同名变量赋值以后就会覆盖之前的变量值
初始值
对于var和let声明的变量来说可以不设置初始值,但是const声明的变量必须设置初始值
var a
let b
const c
很明显对c进行报错
相信大家从前面已经能够看出来var和let,const的区别了,那么根据这些特性,我们再聊聊es6出现解决了es5的问题
ES6中的这两个声明变量的方式解决了什么问题?
内层变量可能覆盖外层变量
用来计数的循环变量泄露为全局变量
从变量名称作用域我们可以看出来,对于var所声明变量来说,只要对相同名称的变量进行赋值时,就会覆盖原有变量的值,而使用let和const则不会存在这方面问题
下面是哈士奇给大家整理出来的相关的对比和汇总,大家可以参考一下