一,let命令
1,基本用法
ES6 新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
2,特点
- 特点一:使用let关键字声明的变量具有块级作用域,声明的变量只在所处于的块级有效 (块级作用域:在大括号中产生的作用域)
if (true) {
let num = 100;
var abc = 200;
}
console.log(abc); //200
console.log(num); //error:num is not defined
let声明的num变量,只存在于块级作用域(在大括号中产生的作用域)因此报错。
由于这个特性,let可以用来防止循环变量变成全局变量 例如:循环中的计数器,当循环结束时,计数器就没必要存在了
for (var i = 0; i < 5; i++) {
}
console.log(i); //5
for (let j = 0; j < 5; j++) {
}
console.log(j); //error: j is not defined
用let声明的计数器j,只存在for循环中的块级作用域,不会成为全局变量,因此报错。
- 特点二:let声明的变量,不存在变量提升,只能先声明后使用
console.log(a); //a is not defined
let a = 20;
上面这段代码,由于let声明不存在变量提升,所以会报错
- 特点三:let声明的变量,具有暂时性死区特性
var tmp = 10;
if (true) {
console.log(tmp); //tmp is not defined
let tmp = 20;
}
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
- 特点四:let不允许在相同作用域内,重复声明同一个变量。
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
二,const命令
1,基本用法
const声明一个只读的常量。一旦声明,常量的值就不能改变。
2,特点
- 特点一:一旦声明,常量的值就不能改变
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
上面代码表明改变常量的值会报错。
- 特点二:const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。
const foo;
// SyntaxError: Missing initializer in const declaration
上面代码表示,对于const来说,只声明不赋值,就会报错。
- 特点三:const的作用域与let命令相同:只在声明所在的块级作用域内有效。
if (true) {
const MAX = 5;
}
MAX // Uncaught ReferenceError: MAX is not defined
- 特点四:const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
if (true) {
console.log(MAX); // ReferenceError
const MAX = 5;
}
上面代码在常量MAX声明之前就调用,结果报错。
- 特点五:const声明的常量,也与let一样不可重复声明。
var message = "Hello!";
let age = 25;
// 以下两行都会报错
const message = "Goodbye!";
const age = 30;