var和let以及const的区别
一、var是ES6之前的变量声明方式,使用var声明的变量,其作用域为该语句所在的函数内,并且存在变量提升现象。
由于变量提升的关系,我们可以看到在if语句里面,我们在 a赋值前将其输出并没有报错。还有就是我们在if语句外面再次输出a,居然可以正常输出。这和我们学习的其他语言感觉出现了冲突。于是ES6之后新增了新的变量声明方式。let
<script>
if (true) {
console.log(a);
var a = 3;
}
console.log(a);
</script>
二、使用let 声明的变量,其作用域为该语句所在代码块内,不存在变量提升。
1、let声明的变量只在所处于的块级有效
我们使用let在if语句里面声明了一个a,在if语句外输出时就会报错 a is not defined。
这就是因为其中的a只在所处的块级区域有效(及if语句的大括号内)。(使用var声明的变量)不具有块级作用域特性
if (true) {
let a = 10;
}
console.log(a); // 报错,a is not defined
2、let 不存在变量提升
不同于使用var声明的变量,这里会报错 就是因为let声明的变量不存在变量提升。于是在定义之前输出数据,就会报错(提示a没有初始化)。
console.log(a);
let a = 20;
3、暂时性死区:let声明的变量会被整体绑定在这个块级区域不再受外部代码的影响
var tmp = 123;
if (true) {
console.log(tmp);
let tmp = 3;
}
三、const 声明常量,常量就是值(内存地址)不能变化的量。
1、它与const一样具有块级作用域
2、声明常量时必须赋值,如果常量未赋值则会报错“Missing initializer in const declaration”
const PI; //Missing initializer in const declaration
3、常量赋值后,值不能修改
要是修改后也会报错“const PI = 3.14;
PI = 100; //Assignment to constant variable.”
const PI = 3.14;
PI = 100; //Assignment to constant variable.
四、什么时候使用它们呢?
1、在我们编写程序的过程当中,如果存储的值不需要变化,尽量使用 const 关键字。比如函数的定义,或者数学中一些恒定不变的值,如PI。因为使用const关键字声明的值不能变化,JavaScript解析引擎不需要实时监控值的变化,所以const关键字要比let关键字效率高。