Var、Let、Const
在写算法时遇见了一些基础问题,于是写一个博客记录一下。
Var(ES5)特点(也可以说问题)
- 存在变量提升 - 1 
 2
 3
 4
 5
 6
 7- console.log(a); 
 var a = 10;
 // 编译过程会转变为,就是声明的a提升到前面了
 var a;
 console.log(a); // undefined但可以调用,离谱不?
 a = 10;
- 一个变量可多次声明,后面的声明会覆盖前面的声明 - 1 
 2
 3- var a = 10; 
 var a = 20;
 console.log(a); // 20,是的var又用了一次,但还是没报错
- 在函数中使用var声明变量的时候,该变量是局部的 - 1 
 2
 3
 4
 5
 6- var a = 10; 
 function change(){
 var a = 20;
 }
 change();
 console.log(a); // 10- 而如果在函数内不使用var,该变量是全局的 - 1 
 2
 3
 4
 5
 6- var a = 10; 
 function change(){
 a = 20
 };
 change();
 console.log(a); // 20- 大家觉得这些问题,有点匪夷所思,于是ES6就改进了 
Let
- 解决了变量提升 
- 不能重复声明 - 1 
 2- let a = 10 
 let a = 20- 会报错 
- 局部变量,只能在代码块中使用 - 1 
 2
 3
 4- { 
 let a = 10;
 }
 console.log(a);- 但在不同定义域就可以 - 1 
 2
 3
 4
 5- let a = 10; 
 {
 let a = 20;
 }
 console.log(a);//10,如果是var的话就是20
Const(翻译是”常量“)
- Let的所有特性 
- 只能声明一个只读变量 - 实际项目中一般都是用这个,后面有改动才考虑let,var基本上淘汰了 - 1 
 2- const a = 10; 
 a = 20 //会报错
- 必须初始化 - 1 
 2- const a;//会报错 
 const a = 10;//正确
- const 可以通过变量指向改动(const是指向的地址,对应的那个数据不能改动) - 1 
 2
 3
 4
 5
 6
 7
 8
 9- const obj = { 
 age: 17
 }
 obj.age = 18; // ok
 obj = {
 age: 18
 }
 // SyntaxError: Identifier 'obj' has already been declared- 如上,obj是被指向的地址中的数据,我们无法改动{},但可以改动{}中的age 
let一般应用于基本数据类型;const 一般应用于引用数据类型,也就是函数对象等。