1.1 let和const
1.1.1 let基本用法
用法類似var,表示常量,只在let命令所在程式碼塊內有效。
1.1.2 const基本用法
const宣告只讀常量。一旦宣告常量的志不能變。一旦宣告,必須立即賦初始值,不能留到以後賦值。
const foo = {};
// 為 foo 新增一個屬性,可以成功
foo.prop = 123;
foo.prop // 123
// 將 foo 指向另一個物件,就會報錯
foo = {}; // TypeError: "foo" is read-only
複製程式碼
本質:const實際上保證的,並不是變數的值不得改動,而是變數指向的那個記憶體地址所儲存的資料不得改動。
1.2.3 let和const共同點
1.不存在變數提升
變數提升:var命令會發生“變數提升”現象,即變數可以在宣告之前使用,值為undefined
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
// let或const 的情況
console.log(bar1); // 報錯ReferenceError
console.log(bar2)
let bar1 = 2;
const bar2 = 3;
複製程式碼
2.暫時性死區
只要塊級作用域內,存在let或const命令,它所宣告的變數就繫結這個區域,不再受外部的影響。
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
複製程式碼
在程式碼塊內,使用let或const命令宣告變數之前,該變數都是不可用的。這在語法上,稱為“暫時性死區”。
ES6 規定暫時性死區和let、const語句不出現變數提升,主要是為了減少執行時錯誤,防止在變數宣告前就使用這個變數,從而導致意料之外的行為。
3.不允許重複宣告
let和const不允許在相同作用域內重複宣告一個變數。
// 報錯
function func() {
let a = 10;
var a = 1;
}
// 報錯
function func() {
var a = 10;
let a = 1;
}
// 報錯
function func(){
let a = 10;
let a = 1;
}
// 不報錯
function func(){
var a = 10;
var a = 1;
}
複製程式碼
1.2塊級作用域
好處
1.外層程式碼塊不受內層程式碼塊影響,外層作用域無法讀取內層作用域的變數,內層作用域可以定義外層作用域的同名變數而不受影響。
// ES6
function foo(){
let a = 0;
if(true){
let a = 1;
}
console.log(a); // 0
}
// ES5
function foo(){
var a = 0;
if(true){
var a = 1;
}
console.log(a); // 1
}
複製程式碼
2.迴圈變數不會洩漏為全域性變數
// ES6
let s = 'hello';
for(let i = 0;i<s.length;i++){
console.log(s[i]);
}
console.log(i); // 報錯, i is not defined
// ES5
var s = 'hello';
for(var i = 0;i<s.length;i++){
console.log(s[i]);
}
console.log(i); // 5
複製程式碼
3.函式執行更簡潔
// ES6
{
...;
}
// 匿名立即執行函式表示式
(function(){
...;
}());
複製程式碼
1.3ES6六種宣告變數的方法
- var(ES5)
- function(ES5)
- let(ES6)
- const(ES6)
- import(ES6)
- class(ES6)
摘自阮一峰