var,let与const详解
在JavaScript中有三种声明变量的方式:var以及es6新加入的let与const
首先先用一张图片来表达三者的相同点与不同点:
由主要是 var 的缺点,存在变量提升,现在var基本上已经不建议使用了,所以下面只详细介绍let与const这两种定义变量的方式
let
1.es6新增加的let声明变量只在所处于的块级作用域有效,块级作用域:就是一对{}产生的作用域,一对{}就代表着一个块级作用域,具有块级作用域的变量只能在块级作用域中访问
if (true) {
let a = 10;
console.log(a); //1o
if (true) {
let c = 20;
}
console.log(c); // dedind
}
console.log(a); //a is defind let声明的变量只在块级作用域里有用
2.var与let的区别
if (true) {
let num = 10;
var nuum = 10;
}
console.log(nuum); //10
console.log(num); //defind
3.防止循环变量变成全局变量
for (var i = 0; i < 10; i++) {
//如果把var 改为let那么在for循环外面就访问不到i了
}
console.log(i); //var定义的变量i能够被打印
4.let声明的变量没有变量提升
//只能先声明再使用
console.log(cc); //undefind
var cc = 10;
console.log(ee); //会直接报错
let ee = 11;
5.let暂时性死区特性
只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123;
if (true) {
console.log(tmp); //报错 ,此时的tmp变量和全局中的变量没有关系,查找作用域会先查找本级作用域
let tmp = 'abc';
}
const
onst关键字用于声明常量,常量就是值(内存地址)不能变化的量
1.使用const常量声明的值同样具有块级作用域
if (true) {
const a = 10;
if (true) {
const a = 100;
console.log(a); //100
}
console.log(a); //10
}
console.log(a); //defind 报错 */
2.使用const声明变量时必须赋值
const a; //语法都会直接报错,赋值才行
3.const常量赋值后,值不能修改
const c = 5;
c = c + 5;
console.log(c); //报错
4.常量声明后的值不能更改,实际上指的是对应的内存地址不可更改
const arr = [100, 200];
arr[0] = 1;
arr[1] = 2;
console.log(arr); //Array [ 1, 2 ]
arr = [3, 4];
console.log(arr); //报错 ,内部的值可以更改但是内存地址不允许被更改
总结
var 声明变量,其作用域为所在的函数内,且存在变量提升
let 声明变量,其作用域为所在的代码块内,不存在变量提升
const 声明不是变量是常量,在后面出现的代码中不能修改改常量的值