在我们现今使用的es6中,新增了let和const两种声明变量和常量的关键字,旨在解决var关键字的一些局限性,与var相比,let和const提供了更加严格以及更符合预期的行为,那他们具体都有一些什么特点呢?
var和let的区别
众所周知,var和let都是声明变量的关键字,他们的区别主要有以下几种:
变量提升和暂时性死区
在javascript中,使用var声明变量会受到变量提升的影响,用var声明的变量都会被提升至其所在作用域的顶部,但要注意只是声明会提升,初始化则不会,所以如果你在初始化var前就访问它那么就会返回undefined:
var i; //相当于这样
console.log(i); // undefined
var i = "奶龙";
如果是先初始化再访问的话那就可以正常输出了。
使用let声明的变量也会提升至其所在作用域的顶部,但是与var不同的是,let声明的变量会在初始化之前进入一个暂时性死区,此时访问的话则会导致RefereneceError:
console.log(i); //ReferenceError: Cannot access 'i' before initialization
let i = 1;
同样先初始化再访问就可以了:
let i = 1;
console.log(i); //输出1
作用域的不同
JavaScript中变量的作用域有三种:全局作用域、函数作用域和块级作用域,其中函数作用域和快据作用域属于局部作用域。
var关键字只能在全局作用域和声明其的函数作用域中使用,如果在外部访问的话则会报错:
function study(){
var i = 1;
console.log(i);
}
//study(); //输出1
console.log(i); //ReferenceError: i is not defined
let声明的变量具有块级作用域,只能在块级内部被使用,如果在外部使用则会返回ReferenceError:
if(true){
let i = 1;
//console.log(i); //输出1
}
console.log(i); //ReferenceError:i is not defined
其他不同
var在作用域内能冗余声明:
var i = 1;
var i = 2;
var i = 3;
console.log(i);
而let不能冗余声明,多次声明将会报错:
let i = 1;
let i = 2;
console.log(i);
const的使用
与var和let不同的是,const关键字是用来声明一个常量的,在声明时必须将其初始化,且赋值之后不能二次修改。
const STUDY = 1;
const STUDY = 2;
const STUDY = "sleep"
const和let一样同样支持块级作用域,在块级作用域外访问将会报错
if(true){
const xm = {
name:"study",
age:18,
hobbies:["吃饭","睡觉","打豆豆"]
}
//console.log(study) //输出study
}
console.log(study) //ReferenceError: study is not defined
我们上面说到const被赋值之后不可以再被修改,但是有特殊情况,就是当你用const声明的是一个复杂的数据类型如上面的对象xm,那么就可以改变对象中某一个属性的值:
const xm = {
name:"study",
age:18,
hobbies:["吃饭","睡觉","打豆豆"]
}
study.age = 20; //改变age属性的值
console.log(study);
输出study之后发现age变成了20
但仅限于修改已经声明的键值对中的值,并不能增加或减少属性,也不能将属性值的类型改变。
小结
在JavaScript中这三种关键词都是我们频繁使用到的,更早了解其中的细微差异,掌握它们的使用,距离成为前端大佬又更进一步。