let 有一定稳定性
1 let声明的变量具有块级作用域({} 里面的区域)var关键字是不具备这个特点的
2 防止循环变量变成全局变量
3 let声明的变量没有声明提升(必须先声明,才能使用)
4 let声明的变量具有暂时性死区:
如果当前块级作用域中有声明该变量,就不会使用上层作用域的变量
/* --------let关键字就是用来声明变量的-------- */
let a = 10;
console.log(a); // 10
/* --------使用let关键字声明的变量具有块级作用域-------- */
if (true) {
let b = 20;
console.log(b) // 20
if (true) {
let c = 30;
}
console.log(c); // c is not defined
}
console.log(b) // b is not defined
/* -------在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的--------- */
if (true) {
let num = 100;
var abc = 200;
}
console.log(abc); //200
console.log(num) // num is not defined
/* -------防止循环变量变成全局变量--------- */
for (let i = 0; i < 2; i++) {}
console.log(i); // i is not defined
let 不存在变量提升
/*-----使用let关键字声明的变量没有变量提升------*/
//必须是先声明才能使用
console.log(a); // a is not defined
let a = 100;
console.log(b); //undefined
var b = 100;
/* -------使用let关键字声明的变量具有暂时性死区特性------- */
// 暂时性死区:一个块级作用域中,如果有代码声明一个变量,当前块级作用域只能使用该变量,如果在声明之前使用 ,会报错,声明之后可以正常使用
var num = 10
if (true) {
console.log(num); //只能使用let块级变量,不能使用var
let num = 20;
}
const 语法更加严格,效率高
const声明的常量具有块级作用域
const声明的常量必须要赋值
const声明的常量不能更改栈中的值(可以更改堆中的值)
暂时性死区
// 1 使用const关键字声明的常量具有块级作用域
if (true) {
const a = 10;
if (true) {
const a = 20;
console.log(a); //20
}
console.log(a); //10
}
console.log(a); // a is not defined
// 2 使用const关键字声明的常量必须赋初始值
const PI; // 申明常量必须赋值
const PI = 3.14;
// 3 常量声明后值不可更改
// const PI = 3.14;
// PI = 100; // 简单数据类型不可更改值
// const ary = [100, 200];
// ary[0] = 123; //复杂数据类型可更改值,因为里面接收值的地址为更改。
// ary = [1, 2] // 但是不可直接赋值,直接赋值,是更改了里面储存的地址
// console.log(ary);
let const var 区别
1. 使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。
2. 使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
3. 使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值