一、变量提升
使用var声明的变量存在变量提升现象,const、let不存在变量提升
a=3
console.log(a); //3
var a;
b = 4;
console.log(b);
let b;
c=5;
console.log(c);
const c;
二、作用域及特性
var | let | const |
函数级作用域 | 块级作用域 | 块级作用域 |
let
// 使用let关键字声明的变量具有块级作用域
if (true) {
let b = 21;
console.log(b);
if (true) {
let c = 12;
}
// console.log(c); //c is not defined
}
console.log(b); //b is not defined
在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
// 在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
if(true){
let num=100;
var abc=200;
}
console.log(abc); //200
console.log(num); //num is not defined
let关键字防止循环变量变成全局变量
// 防止循环变量变成全局变量
for(var j=0;j<6;j++){}
console.log(j); //6
for(let i=0;i<6;i++){}
console.log(i); //i is not defined
使用let关键字声明的变量具有暂时性死区特性,在代码块内,使用let命令声明变量之前,该变量都是不可用的
var num=10;
if(true){
console.log(num);
let num=20;
}
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
三、值能否更改
const常量声明后值不能更改,let、var可以
const arr = [122, 112];
arr[0] = 12345;
console.log(arr); //[12345, 112]
arr=[123,121];
console.log(arr); //Uncaught TypeError: Assignment to constant variable.