谈谈ES6的let和const
2019-11-20 本文已影响0人
明人不放按屁
在js中,变量只有两种,全局变量和局部变量,但是之前的版本并没有‘块级作用域‘这个说法,‘块级作用域’即所在的代码块 {} 内有效。例如:
{
var x = 2;
}
console.log(x) // 输出2
var x = 10;
{
var x = 2;
}
console.log(x) // 输出 2
但是ES6中增加了let关键字,使用let可以实现‘块级作用域’,例如:
{
let x = 2;
}
console.log(x) //报错, x is not defined
var x = 10;
{
let x = 2;
}
console.log(x)// 输出 10
注意:在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量,也不能使用 const 关键字来重置 var 和 let关键字声明的变量
例如:
var x = 2; // 合法
let x = 3; // 不合法
{
var x = 4; // 合法
let x = 5 // 不合法
}
//同样的
let x = 10;
{
var x = 2;
}
console.log(x)// 输出 报错
var x = 2; // 合法
const x = 2; // 不合法
{
let x = 2; // 合法
const x = 2; // 不合法
}
另外,不仅仅在说明变量的时候var和let有区别,在循环作用域中,两者也有不同。在for循环中,var依然没有‘块级作用域’这个
//使用var
var i = 5;
for (var i = 0; i < 10; i++) {
console.log(i);//0.1.2.3...9
}
console.log(i);//10
//使用let
let i = 5;
for (let i = 0; i < 10; i++) {
console.log(i);//0.1.2.3...9
}
console.log(i);//5
在第一个实例中,使用了 var 关键字,它声明的变量是全局的,包括循环体内与循环体外。
在第二个实例中,使用 let 关键字, 它声明的变量作用域只在循环体内,循环体外的变量不受影响。
ES6除了增加变量关键字let以外,还增加了常量关键字const,用于声明一个或多个常量,声明时必须进行初始化,且初始化后值不可再修改:
const PI = 3.141592653589793;
PI = 3.14; // 报错
var x = 10;
{
const x = 2;
console.log(x) // 2
}
console.log(x)// 10
但是const 定义的变量并非常量,并非不可变,使用 const 定义的对象或者数组,其实是可变的。例如:
// 创建常量对象
const car = {type:"Fiat", model:"500", color:"white"};
// 修改属性:
car.color = "red";
console.log(car.color)//red
但是我们不能对常量数组重新赋值:
const cars = ["Saab", "Volvo", "BMW"];
cars = ["Toyota", "Volvo", "Audi"]; // 错误