let命令的基本用法
let命令类似于var命令,用于对变量的声明。 let与var相比有3个比较特殊的地方
- 存在块级作用域
- 存在暂时性死区
- 单个变量不允许重复声明
块级作用域
在C,java等传统编译型语言中存在块级作用域,指的是在大括号的代码块中,声明的变量只会作用于代码块,不会跃升为全局变量,可以看做是局部变量,外界也无法访问。
可以借助常见的for循环来理解
//es5中的var
for(var i = 0;i<5;i++){
}
console.log(i) // 正常: 5
//es6中的let
for(let j = 0;j<5;j++){
}
console.log(j); // 报错: j is not defined
在大括号的代码块中使用var声明的变量不存在块级作用域,会被当成全局变量,被外界访问,而使用let声明则刚好相反。
暂时性死区
简单来说,就是let定义的变量,需要先声明后使用,同时由于暂时性死区的特性,所以之前使用var定义存在的变量提升也不存在了。 这里解释下:变量提升指的是 引擎在执行js脚本时,会对js代码进行预解析,将声明有关的语句(仅仅只是声明,不包括赋值操作)提升至代码的最前面,所以var定义的变量在声明之前被使用了也不会报错。
//es5中的var
console.log(i);
var i =2; // 正常: undefined
//es6中的let
console.log(j);
let j =2; // 报错: cannot access 'j' before initialization
可以看出提前使用了具有暂时性死区的let声明变量,会在执行时出错,禁止了变量提升,可以减少许多意料之外的行为,利于程序的运行稳定性。
单个变量不允许重复声明
使用let命令,不允许变量被多次声明,否则会执行出错
- 使用var命令重复声明
//es5中的var
var i =1;
console.log(i); // 正常: 1
var i =2;
console.log(i); //正常: 2
- 使用let命令重复声明
//es6中的let
let j =1;
console.log(j);
let j=2; //出错: identifier 'j' already been declared
console.log(j);
const命令
let命令的特性,const命令也都有,两者最大差别在于 const声明的是一个可读的常量,意味着一旦被声明就无法更改赋值。
const a = 1;
a = 1; // 报错:assignment to constant variable
const 无法更改的特性也意味着你不能使用const只声明不赋值。
注:const所维护的变量不可改变指的是 变量所指向的保存数据的内存地址不可改动。 对于字符串,数值或者布尔值等基本类型值来说,变量指向的就是保存内存的地址,一旦基本类型的变量进行更改,意味着变量指向的内存地址就会变动。 对于函数,对象,数组等引用类型值来说,变量指向的是一个指向实际数据的指针。const只能保存指针指向的内存地址不变,至于指向的数据的具体结构,就不受限制。
const a = {};
a.test = 1;
console.log(a.test); // 正常:1 === 没有改变内存地址,只改变了数据的结构
a = {}; // 报错: assignment to constant variable === 变量指向的内存地址改变了
ES6中声明变量的六种方式
- var
- function
- let
- cosnt
- import
- class
还有一点要注意:const与let在全局作用域中声明的变量不会被挂载到顶层对象中(如 window)。