重复定义 | 修改值 | 声明提升 | 块级作用域 | 循环 | |
var | √ | √ | √ | ×(function除外) | √ |
let | × | √ | × | √ | √ |
const | × | ×(数组对象除外) | × | √ | × |
声明提升:var a = 1
这句话会被浏览器读成 var a
和a = 1
两句话执行,其中var a
会在编译阶段就先执行了,而a = 1
这段赋值代码会在原地等待执行阶段。
var重复定义变量会覆盖之前的值,可以修改,var声明的变量的作用域是定义变量的整个函数
function testVar(){ var a = 0; if(true){ var a =1; console.log(a)//输出1,两个a是同一个变量 } console.log(a)//输出1 }
var temp = new Date();console.log(temp);
function f(){
console.log(temp);//输出undefined 外边的temp作用不到function中 内部的temp会被声明提升
if(false){
var temp = "hello";
}
}
f();
let不能重复定义变量也不能声明提升,let声明的变量的作用域是当前块
function testLet(){ let a = 0; if(true){ let a =1; console.log(a)//输出1,两个a是不同的变量
} console.log(a)//输出0 }
const定义的变量只读不可修改,但是数组的对象除外
const a={}; a.b=13;//不会报错
const arr=[]; arr.push(123);//不会报错