let与const
ES6 新增加了两个重要的 JavaScript 关键字: let 和 const。let 声明的变量只在 let 命令所在的代码块内有效。const 声明一个只读的常量,一旦声明,常量的值就不能改变。
let
let声明:块级作用域
let跟var作用类似,但是有很大的区别就是一个块级作用域,而var声明的范围是函数作用域。也就是说let声明的变量只在它所在的代码块有效。
for (let i = 0; i < 10; i++) {
console.log(i);
}
console.log(i); // i is not defined
let特点二:不存在变量提升
let 不像var 那样会发生 ‘变量提升’ 现象,因此,变量需要先声明然后再使用,否则报错;
// var 的情况
console.log(a); // undefined
var a = 2;
// let的情况;
console.log(b); // 报错
let b = 2;
let特点三:暂时性死区
块级作用域内存在let命令,它所声明的变量就绑定在这个区域,不再受外部影响;
var a = 123;
if (true) {
a = 'abc';
let a;
console.log(a); // a is not defined
}
代码定于全局变量a,但是在块级作用域内let又声明了一个局部变量a,导致绑定了这个块级作用域;因此打印出a会报错。
特点四:不允许重复声明
let不允许在相同的作用域内,重复声明一个变量。
function a() {
let a1 = 10;
let a1 = 1;
console.log(a1);
}
a();
const
const特点一:
const声明一个只读常量,声明后常量的值就不允许被改变。
const a = 1;
a = 2;
console.log(a); //报错
也就是说const只要声明后,就必须初始化,不能留在以后赋值。如果const声明一个变量不被赋值,就会报错。
const aa; // 报错
const特点二:const的作用域与let声明命令相同,只有在块级作用域内有效。
if (true) {
const aa = 1;
}
console.log(aa); // 报错
这种在外部输出就会报错。
特点三:不可以重复声明和let一样
var message = "Hello!";
let age = 25;
// 以下两行都会报错
const message = "Goodbye!";
const age = 30;
对于复合类型的变量,数组对象等这种储存的地址,不可以改变这个地址,不能把该地址指向另外的地址,但是对象本身是可以改变的,比如给他添加新的属性。
const a = [];
a.push('Hello'); // 可执行
a.length = 0; // 可执行
a = ['55'] // 报错
总结
ECMAScript 6增加let和const从客观上为这门语言更精确地声明作用域和语义提供了更好的支持。
在学习let和const后,可以发现这两种声明方法会比var声明更加明确,提升了代码质量。const和let有助于提升提升代码质量,因为明确了作用域,声明位置,以及不变的值。const优先,let次之。使用const声明可以让浏览器运行时强制保持变量不变。
let的总结:
1.使用let关键字声明的变量具有块级作用域,var关键字是不具备这个特点的。
2. 防止循环变量变成全局变量
3.使用let关键字声明的变量没有变量提升
4.使用let关键字声明的变量具有暂时性死区特性
const的总结:
1.const声明的变量是一个常量
2. 如果是基本数据类型,不能改具体的值,如果是复杂数据类型,不能更改地址
3.使用const声明的时候必须要给定初始值