全面理解var,let,const的区别
首先,把我们常用的var与let,const进行比较一下:
-
var存在变量提升,let和const没有:
console.log(a);// 结果为undefined (进行了变量提升,var a;) var a=1; console.log(b);// 报错 let b=1; console.log(c);// 报错 const c=1;
-
var 可以重复声明,let(在同一作用域不可以重复赋值,在不同作用域可以)、const不可以(最典型区别):
let a=10; let a=100; console.log(a); //报错 Identifier 'a' has already been declared let a=1; function b(){ let a=2; console.log(a);//2 }; b(); console.log(a);//1
-
作用域不同,let和const会形成块级作用域:
if (true){ var a=0; let b=4; const c=5; console.log(c)//5 } console.log(a);//0 console.log(b);//报错 b is not defined
-
var的变量是在window上挂载的:
var a=11; console.log(window.a);//11 let b=12; console.log(window.b);//12 const c=13; console.log(window.c);//13
以上几条就是var与let、const的一些主要区别(也有其他一些没有提到的);
以下是let与const不同之处:
- let在不同一作用域下,值可以改变,类型也可以改变,而const不可以,一旦声明不可改变值,并且一旦声明必须立即赋值,否则报错:
const a;
console.log(a);//报错
-
对于复合类型的变量(数组和对象),变量名指向的是数据地址,而不是数据;且只能保证指向数据地址不变,不能保证该地址下的数据不变:
const age=[]; age=[12,18,24]; //此类型就是指向数据,所以会报错;应该指向数据的地址,例如: const age[]; age[0]=12; age[1]=18; age[2]=24; //这些指向的是数据地址
这些,就是var,const、let的一些主要区别。