一、var
var声明方式不具有块级作用域,在声明的时候可以不用赋值,具有变量提升的特点,也就是说可以在声明前对其进行访问,只是此时的只为undefined
。
console.log(a);//undefined
var a = 1;
console.log(a);//1
由于其不具有块级作用域,所以在其对应的作用域外也可以对其进行访问,同时
对其进行重复声明时不会报错。
console.log(a);//undefined
var a = 1;
console.log(a);//1
var a = 'string'
console.log(a);//string
{
var a = 2;
console.log(a);//2
}
console.log(a);//2
这也就意味着在项目中,如果没有与成员沟通好的话,后面的声明可能会将前面的变量覆盖,并且基于js的特点,此种声明方式不会报错,后续的找错将会特别麻烦。所以这种声明方式在项目中不推荐使用。
二、let
let声明方式具有块级作用域,在声明前具有暂时性死区的特点,所以在声明前不能对其进行访问,否则会报错。
console.log(num);//报错 Cannot access 'num' before initialization
let num = 2;
console.log(num);//2
声明时可以不用赋值,后续可以对其进行修改且不能重复声明,可以满足开发需求,在项目的开发中此种声明方式是比较推荐的。
let str = 'hello';
console.log(str);//hello
str = 'world';
console.log(str);//world
let str = 2;// 报错 Identifier 'str' has already been declared
三、const
const声明具有块级作用域,与let基本相同,但const声明时就需要对其进行赋值,声明后不能再次对其进行赋值,否则会报错。
const num;//报错 Missing initializer in const declaration
const obj = {a:1,b:2};
obj.a = 3;
console.log(obj);//{a:3,b:2}
obj = {c:3,d:4};//报错 Assignment to constant variable.
const obj = 2;//报错 Identifier 'obj' has already been declared
可以看出,对const声明的变量再次直接赋值时会报错,对其属性进行修改时不报错,其本质是并没有对const声明的变量进行二次赋值,仅仅只修改了其内部的属性而已。在项目开发中推荐这种声明方式,const具有常量的语义。
四、总结
可以对上述三者做如下归纳:
声明方式 | 变量提升 | 暂时性死区 | 重复声明 | 初始值 | 作用域 |
var | 允许 | 不存在 | 允许 | 不需要 | 非块级 |
let | 不允许 | 存在 | 不允许 | 不需要 | 块级 |
const | 不允许 | 存在 | 不允许 | 需要 | 块级 |
在项目中对变量的声明还是需要就情况而定,一般来说优先级为const>let>var。