var、let、const 区别
var、let -声明变量
二者的区别:
- 重复声明
- var可重复声明同一个变量,后声明的值覆盖前一个值;
- let不可重复声明同一变量,重复则报错.
( let 和 var一起声明同一变量也不可以,即只要使用let声明变量,该变量就不能声明第二次)
2.块级作用域
var在块级区域以外可以被访问,而let存在块级作用域,仅在所声明的块级区域有效。
3.变量提升
- var声明具有变量提升能力,无论在哪声明,均作为顶部声明(全局有效);
- let声明不具变量提升能力,只在其声明所在块级作用域内有效。
4.暂存性死区
使用let声明,在声明之前的区域将为死区,必须按照规范让声明在前。
//重复声明
// var
var val=10;
var val=200;
console.log(val); //200
// let
let val=10;
let val=200;
console.log(val); //错误,已声明
// 同时
let val=10;
var val=200;
console.log(val);//错误,已声明
/ 同时
let val=10;
var val=200;
console.log(val);//错误,已声明
// 块级区域
{
var a=10;
let b=20;
console.log(a); //10
console.log(b); //20
}
console.log(a); //10
console.log(b); //引用错误 b is not defined
在循环中分别使用var let
// var 是作用于全局的,如果后续再使用就会引起干扰
for (var i = 0; i < 3; i++) {
console.log(i); //0 1 2
}
console.log(i); //3
// let 只在循环内有效,循环作为作用域,在循环外是获取不到的,可以防止干扰
for (let i = 0; i < 3; i++) {
console.log(i); //0 1 2
}
console.log(i); //错误
遍历数组
// var
var arr=[];
for (var i = 0; i < 3; i++) {
arr[i]=function(){
console.log(i);
}
}
arr[1](); //无论设置多少,均为3
// let
for (let i = 0; i < 3; i++) {
arr[i]=function(){
console.log(i);
}
}
arr[2](); //可设置索引得到需要的值
const -声明常量
- const声明只读常量,即值不可以更改,改变会报错;
- const必须声明的同时进行赋值,否则会报错;
- 声明的常量无法提升,有暂存死区。
//值改变
const A=10;
A=100;
console.log(A);//Assignment to constant variable
//未初始
const A;
A=10;
console.log(A);//Missing initializer in const declaration
//无法提升,有暂存死区
console.log(A); //Cannot access 'A' before initialization
const A=10;