在学习JavaScript中是很少离开变量的,在JavaScript这门语言中目前(包括ES6新增)提供了我们熟知的四种方法声明变量,var、function、let、const。这里专注于讲var、let、const(如有空缺,后期补充)。
首先在初识JavaScript时,(至少我是)使用var来声明变量,这里声明一个变量str。
//这里我们声明一个变量str
var str = 'string';
1. 使用var声明时有变量提升,会将变量提升至赋值之上类似于:
//使用var进行声明时会有变量提升
var str;
str = 'string';
2. 而且使用var时是不具备块级作用域的(JavaScript三种作用域:全局作用域[window],局部作用域[函数],块级作用域[例如流程语句的代码块{}])。
//var 不存在块级作用域
if(true) {
var str = 'string';
};
console.log(str);
在控制台中输出为string。
3. 不存在死区(因为有变量提升)
a = 1; //此时a处于全局作用域下
console.log(window);
var a;
console.log(a);
这里打印window展开发现变量a是处于window全局作用域下,当我们var a时并不会影响到上面的赋值,而是自动将变量a提升至赋值上面,故a不为undefined也不会死区。
但在认识ES6后,对声明变量有了更详细的认知,于是认识了let和const(常量)。
let声明变量具有块级作用域和不具备自动提升(可以手动提升)变量(至少官方如此说明)的特点,下面用一段代码演示一下。
{
let str = 'string'; //在块级作用域里用let声明变量
}
console.log(str);
1. 这里会报错提示str未定义,由此证明let具备块级作用域。
2. 所有能使用var的地方都能使用let:
let a;
{
{
a = 5;
}
}
console.log(a);
这里a在控制台输出为5,由此证明let可以手动提升作用域,比var更加严谨和优化。
3.在for等流程控制语句中存在两个不同的块级作用域:
for(let i = 0; i < 9; i++) {
let i;
};
这样写并没有报错,根据在同一作用域下let声明的变量名不能重复的特点,可以得出for()为一个块级作用域,后面的{}为一个块级作用域。
1. const常量,常量的特性和let相似(存在块级作用域,不存在变量提升等等)但只是部分特性一样但它必须赋值。
const PI;
这样会报错,由此可知const必须赋值。
2. const的命名规范,往往采用大写字母,蛇形命名这种规范(非必须),算行内规范。
//蛇形命名
const MAX_VALUE = 10;
3. 不可变性
//不能使用等号赋值
const MAX_VALUE = 10;
MAX_VALUE = 20;
console.log(MAX_VALUE);
这里会报错,所以常量声明赋值后不能以等号改变赋值。
4.声明对象数组内的成员可以更改
const ARR = [ 'a', 'b', 'c'];
ARR[0] = 'c';
console.log(ARR);//['c', 'b', 'c']
这样是可以更改常量数组里的成员的,但仅限于成员,它本身仍然是不可变的。
今天的总结就到这里,如果在文章中发现bug,欢迎大家可以在评论区及时指出来,谢谢!