【ECMAScript6】你不得不知道系列之let、const和var的区别
let关键字是ES6中用来声明变量的:
1、具有块级作用域特性,即let声明的变量只能在一对花括号内起作用。
if(true){
var a=1;
let b=1;
console.log(a);//1
console.log(b);//1
}
console.log(a);//1
console.log(b);//undefined
2、不存在变量提升:即不可像以前先使用变量再声明了。
if(true){
console.log(b);//undefined
let b=1;
console.log(a);//1
var a=1;
}
3、具有暂时性死区特性:
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var num =10;
if(true){
console.log(num);//undefined;这里不会向上级寻找num
var num=1;
}
变量num使用let命令声明,在声明之前,运行 typeof 会抛出一个 ReferenceError。如果一个变量根本没有被声明,使用 typeof 不会报错。
let arr =[];
for(let i=0;i<2;i++){
arr[i] = function(){
console.log(i);
}
}
arr[0]();//output:0
arr[1]();//output:1
for循环产生两个互不干扰的块级作用域,函数只会调用本身所处块级作用域下i变量的值。
const用来声明常量,即值(内存地址)不能变化的量。
const同样具有块级作用域,且其声明常量的时候必须赋值,一旦赋值,其值不能修改。
const PI =3.14;
PI = 100//Error:Assignment to constant variable
const arr = [1,2];
arr[0] = 'a';
arr[1] = 'b';
console.log(arr);//['a','b']:仅改变数组中的数值,地址并未改变;
arr = ['a','b'];//Error:Assignment to constant variable:改变了数组原始的内存地址;
var、const、let的区别:
1、使用var声明的变量,其作用域为该语句所在的函数内且存在变量提升现象(先使用再声明)
2、使用let声明的变量,其作用域为该语句所在的代码块内且不存在变量提升现象(先使用再再声明)
3、使用const声明的常量,其作用域为该语句所在的代码块内且在后续代码中不能修改该常量的值;
简单应用场景介绍:
如果存储的数据不需要变化,尽量使用const关键字,例如函数的定义、PI等,这样JavaScript解析引擎不需要实时监控值的变化,这样const比let效率高。