標籤(空格分隔): ES6數組
ES6規範新增了let、const兩種變量聲明方式,雖然在項目中也常常用到let和const可是和var到底有什麼區別,今天作下總結。函數
for (let i = 0; i < 10; i++) { console.log(i); } console.log('aaa'); console.log(i); // i is not defined
上面代碼中,計數器i只在for循環體內有效,在循環體外引用就會報錯。以下var代碼:code
var a = []; for (var i = 0; i < 10; i++) { a[i] = function() { console.log(i); } } a[6](); // 10
變量i是var聲明的,在全局範圍內都有效,因此每一次循環,新的i值都會覆蓋舊值,致使最後輸出的是最後一輪i的值。
可是若是使用let,聲明的變量僅在塊級做用域內有效,最後輸出的是6. 以下:對象
var b = []; for (let j = 0; j < 10; j++) { b[j] = function() { console.log(j); } } b[6](); // 6
let 不像var 那樣會發生 ‘變量提高’ 現象,所以,變量須要先聲明而後再使用,不然報錯;內存
// var 的狀況 console.log(foo); // undefined var foo = 2; // let的狀況; console.log(bar); // 報錯 let bar = 2;
快級做用域內存在let命令,它所聲明的變量就綁定在這個區域,再也不受外部影響;以下代碼:作用域
var tmp = 123; if (true) { tmp = 'abc'; let tmp; console.log(tmp); // tmp is not defined }
上面代碼定於全局變量tmp,可是在快級做用域內let又聲明瞭一個局部變量tmp,致使綁定了這個快級做用域;所以打印出tmp會報錯。io
let 不容許在相同做用域內,重複聲明同一個變量。以下代碼排錯console
function a() { let a = 10; var a = 1; console.log(a); } a(); function a() { let a1 = 10; let a1 = 1; console.log(a1); } a();
也不能在函數內部從新聲明參數。for循環
function func1(arg) { let arg; // 報錯 } function func2(arg) { { let arg; // 不報錯 } }
ES6的塊級做用域function
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5 } f1()
上面的代碼有2個代碼塊,都聲明瞭變量n,運行後輸出5,說明了外層代碼塊不受內層代碼塊的影響,若是使用了變量var,那麼輸出的就是10;
const 聲明一個只讀的常量,一旦聲明,常量的值就不容許改變。
以下代碼:
const a = 1; a = 2; console.log(a); //報錯
也就是說 const 一旦聲明瞭變量,就必須初始化,不能留到之後賦值。若是使用const聲明一個變量,可是不賦值,也會報錯;以下代碼:
const aa; // 報錯
const的做用域與let命令相同;只在聲明所在的塊級做用域內有效。
if (true) { const aa = 1; } console.log(aa); // 報錯
不可重複聲明 (和let同樣)
var message = "Hello!"; let age = 25; // 如下兩行都會報錯 const message = "Goodbye!"; const age = 30;
可是對於複合類型的變量,好比數組,存儲的是一個地址,不可改變的是這個地址,即不能把一個地址指向另外一個地址,可是對象自己是可變的,好比能夠給它添加新的屬性,以下代碼:
const a33 = []; a33.push('Hello'); // 可執行 a33.length = 0; // 可執行 a33 = ['55'] // 報錯