ES6 之 let、const 与 var
在进行变量声明的时候我们一般使用的是var
,但是在 ES6 中新增的语法中有了let
和const
,今天我们来看看它们的区别。
一.为什么使用 ES6?
每一次标准的诞生都意味着语言的完善,功能的加强。JavaScript
语言本身也有一些令人不满意的地方。
变量提升特性增加了程序运行时的不可预测性;
语法过于松散,实现相同的功能,不同的人可能会写出不同的代码;
所以在 ES6 中进行了新增的变量let
与const
;
二.let
let
允许你声明一个作用域被限制在块级中的变量、语句或者表达式
。与var
关键字不同的是,var
声明的变量只能是全局或者整个函数块的。var
和let
的不同之处在于后者是在编译时才初始化。
1.作用域
let
声明的只在一个块级中有效,与var
不同,var
是在整个封闭函数中有效:
结果已经很明显了,我们var
声明的变量可以进行访问到,但是let
却无法来进行访问到,反而会进行报错;
在程序和方法的最顶端,
let
不像var
一样,let
不会在全局对象里新建一个属性。比如:位于函数或代码顶部的var
声明会给全局对象新增属性, 而let
不会。
2.不存在变量提升
在前面所遇到的 var 进行声明变量时经常会遇到变量提升的问题,但是 let 不会进行变量提升;
var
变量提升
let
不会进行变量提升
3.暂存死区
暂时性死区:(利用let
声明的变量会绑定在这个块级作用域,不会受外界的影响),普通的var
在外面的声明会影响到在块级里面的变量值;
var
影响
let
暂存死区
4.重复声明变量问题
let
:在同一个函数或块作用域中重复声明同一个变量会引起SyntaxError
。
var
:重复声明问题
let
:重复声明
5.总结
let
关键字就是用来声明变量的;使用
let
关键字声明的变量具有块级作用域;在一个大括号中 使用
let
关键字声明的变量才具有块级作用域var
关键字是不具备这个特点的;防止循环变量变成全局变量;
使用
let
关键字声明的变量没有变量提升;使用
let
关键字声明的变量具有暂时性死区特性;
三.const
1.定义
常量是块级范围的,非常类似用
let
语句定义的变量。但常量的值是无法(通过重新赋值
)改变的,也不能被重新声明。<br>创建一个常量,其作用域可以是全局或本地声明的块。 与var
变量不同,全局常量不会变为window
对象的属性。需要一个常数的初始化器;也就是说,您必须在声明的同一语句中指定它的值(这是有道理的,因为以后不能更改)。<br>const
声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。例如,在引用内容是对象的情况下,这意味着可以改变对象的内容(例如,其参数)。<br>关于“暂存死区
”的所有讨论都适用于let
和const
。<br>一个常量不能和它所在作用域内的其他变量或函数拥有相同的名称。
2.块级作用域
const
和let
大差不差在块级中有效存在
3.赋予初始值
在声明后必须赋予其一个初始值,因为它是不能修改的。
4.常量不可以修改
常量不可以修改指的是我们不能再次去通过名称来进行对其赋值,但是其中的值可以进行修改,也就是说其引用内容可以进行修改;
很明显的验证了其变量不可以被修改,那么我们可以来采用一些方法进行修改它的值,例如:
5.总结
const
声明的变量是一个常量;<br>既然是常量不能重新进行赋值,如果是基本数据类型,不能更改值,如果是复杂数据类型,不能更改地址值;<br>
声明
const
时候必须要给定值;<br>
四.区别
使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;<br>
使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升;<br>
使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值;<br>如图所示:
版权声明: 本文为 InfoQ 作者【木偶】的原创文章。
原文链接:【http://xie.infoq.cn/article/0f77bcf4d3752d5c89d349463】。文章转载请联系作者。
评论