let、const、var的区别
-
变量提升
- var 声明的变量存在变量提升,在声明前可以调用,直为undefind
相当于:console.log(a); var a = 1;
var a; console.log(a); a = 1;
- let和const不存在变量提升,变量要在声明前调用,否则报错
报错如下:console.log(a); // let a = 1;
- var 声明的变量存在变量提升,在声明前可以调用,直为undefind
-
暂时性死区
- var 不存在暂时性死区
- let 和 const 存在暂时性死区,声明变量以后才可以获取和调用该变量
-
块级作用域
- var 不存在块级作用域
var bool = true; if(bool){ let a = 1; console.log(a); // 1 } console.log(a); // 1
- let 和 const存在块级变量
var bool = true; if(bool){ let a = 1; console.log(a); // 1 } console.log(a); // a is not defined
- var 不存在块级作用域
-
初始值设置
- var 和 let 可以不设置初始值
var a; let b; console.log(a); //undefined console.log(b); //undefined
- const 声明变量必须设置初始值,不设置会报错
const c; console.log(c);
- var 和 let 可以不设置初始值
-
重复声明
- var 允许重复声明
var a = 1; var a = 2; console.log(a); // 2
- let和const不允许重复声明,会抛出 SyntaxError 的错误
let a = 1; let a = 2; console.log(a);
- var 允许重复声明
-
数据修改
- var 和 let 可以修改数据
- const 定义的常量是基本数据类型,不能修改。定义的常量要是引用数据类型,就可以修改。因为保存在栈内存的数据是不可以被修改的。而基本数据类型是直接存储在栈内存中的,所以不能被修改。引用数据类型在栈内存中存储的是一个指针,真正的数据存储在指针指向的堆地址,不可被修改的是指针,真正的数据是可变的。
-
重新赋值
- var 和 let 声明的变量都可以重新赋值
- const 声明的是常量不能重新赋值