前言
JavaScript中使用let、const和var三个关键字来声明变量,其中let和const是在ES6及之后的版本才开始使用。那么ES6中新增的这两个关键字的作用与var有什么不同呢?让我们来看下。
var和let
var和let有相似的用法,但是它们有着重要的区别
1. 变量提升和暂时性死区
使用var时,会将声明的变量自动提升到函数作用域的顶部
function test() {
console.log(temp);
var temp = 'temp';
}
test();//undefined
//上面的代码等价于
function test() {
var temp;
console.log(temp);
temp = 'temp';
}
test();//undefined
在作用域内,let声明的变量不会被提升,在声明语句之前的范围称为暂时性死区,在暂时性死区中使用未声明的变量会报错
console.log(test);//ReferenceError
let test = 'test';
2. 块作用域
var声明的变量会成为包含它的函数的局部变量,但不具有块作用域
//内层变量可能会把外层变量覆盖掉
var test = 'test';
function f() {
console.log(test);
if (true) {
var test = 'temp';
}
}
f(); //undefined
//循环中计数的变量会变成全局变量
for (var i = 0; i < test.length; i++) {}
console.log(i); //4
let声明的变量具有块作用域
if (true) {
let test = 'test';
}
console.log(test);//ReferenceError
3. 全局声明
var声明的全局变量可以通过全局对象访问
var test = 'test';
console.log(window.test);//test
let声明的变量就不可以
let test = 'test';
console.log(window.test);//undefined
4.重复声明
在同一作用域内使用var多次声明同名变量是合法的
var test;
var test;//不会报错
使用let则不行
let test;
let test;//报错
const
const声明一个只读的常量。因为不可以改变值,所以在声明的时候就要赋值。其他方面与let基本相同:声明的常量不会提升,也具有暂时性死区,具有块级作用域,不能重复声明。
复合类型
const声明的复合类型的值,是可以改变属性的。
const person = {};
person.name = 'test';
这是因为const限制的是所指向的内存地址保存的数据不能改动,原始类型的值直接保存在内存地址上,所以不能改变。但是对于复合类型来说,内存地址上保存的只是指向实际数据的指针,const只能限制它的指向,但是不能限制所指向数据修改属性。