目录前言ES5与es6的区别1. 作用域2. 全局属性3. 变量提升与暂时性死区4. 重复声明let与const的区别1. 常量最佳实践前言 javascript中一共有3种用来声明
javascript中一共有3种用来声明变量的关键字,分别是var、let和const。
其中var关键字是ES5时代的产物,由于ES5对变量的约束很宽松,使用var来声明变量时经常会出现一些预料之外的问题。 ES6为了使变量的定义更加规范,提出了let和const这两个关键字。
因此要解释清楚这三个的区别,首先要从ES5时代和ES6时代的差别说起,主要是var和let的区别。
使用不同的关键字来声明变量,主要就是对变量的作用域有不同的限制,因此var和let最主要的区别就是变量作用域的区别。
做题的时候经常会有在全局和函数体内声明同名变量的场景,要知道不同作用域的变量是不会互相干扰的。
var a = 10;
function logA() {
var a = 20;
console.log(a); // 20
}
console.log(a); // 10
{...}
来限定块级作用域。在全局作用域下使用var和let声明变量,变量都是会在页面的声明周期内存续。
但是使用var声明的变量会成为window对象的属性,使用let声明则不会。
变量的声明、初始化和赋值被分为三步进行,对于var变量,声明和初始化会被提升到作用域的顶部。
也就是说,编译器在遇到var声明时,会先在作用域顶部声明一个var变量并将其初始化为undefined值。
因此在代码执行流遇到var声明语句之前访问var变量并不会报错,而是会访问到undefined值。
(function example() {
console.log(age); // undefined
var age = 20;
})();
// 相当于
(function example() {
var age;
console.log(age); // undefined
age = 20;
})();
即JavaScript引擎在编译时如果遇到let和const声明,会将它们放入暂时性死区以阻止访问,只有在执行到变量声明的语句后,才会将变量从TDZ中移出。
因此如果在变量声明语句之前访问变量,相当于企图访问TDZ中的变量,JavaScript会抛出运行时错误ReferenceError
。
ES5的变量提升和ES6的暂时性死区的区别还有一个“副作用”就是改变了
typeof
操作对于变量的访问性。已知在ES5时对于未声明变量唯一的安全操作是
typeof
,会返回undefined值。TDZ的出现导致即使使用
typeof
,也不能在let和const声明语句执行之前访问let和const变量,依然会报ReferenceError
。
SyntaxError
错误。这个限制不仅体现在let声明对let声明,如果想用let去重复声明var变量也是不被允许的。
同样都是ES6的变量声明关键字,let和const的区别就在于使用const声明创建的是一个值的只读引用。
只读引用意味着对于原始值来说,const声明不可以再重新赋值;
对于引用值来说,const声明不可以再修改引用,但是可以修改对象的属性值或者数组内部的值。
到此这篇关于JavaScript变量中var,let和const的区别的文章就介绍到这了,更多相关js var,let,const内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: JavaScript变量中var,let和const的区别
本文链接: https://lsjlt.com/news/167340.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0