ES6的寫法可以讓JavaScript 變得更簡化、閱讀性更高,現在也有越來越多開源範例還有教學使用ES6,並用Babel來轉換成ES5,而課程也會使用到ES6 ( 其實前幾篇也有用到,只是先跳過了QQ ),所以從現在開始之後的幾篇會有ES6的筆記。
let
與const
有以下三個特點:
let:宣告的變數是可以改變的
const:宣告出來的變數不能被reassinged
let
跟const
跟var
的差別是在作用域不同,let
與const
是限制在他本來宣告的scope
裡。
for(var i = ; i<10, i++){
// do something
}
console.log( i ); //10
在這裡使用var
宣告的i
是全域的,所以在for陳述句外面console可以直接讀到i
的值。
for(let i = 0; i<10, i++){
//do something
}
console.log( i ); // i is not defined
使用let
宣告,作用域外就讀不到這個變數了。
總結:
let
與const
是區塊作用域(block scope),而var是函式作用域(function scope)
js的其中一個特性-hoisting
就是在宣告東西前就可以使用這個東西。
function及var的例子:
test(); //test
function test(){
console.log("test");
}
a; // undefined
var a = 123;
而a雖然print出來的值不是123,但在記憶體中已經存有a的這個變數聲明,因此這邊不是爆錯而是undefined
。
也就等於是:
var a;
console.log( a ); // undefined
let的例子:
b; //ReferenceError: b is not defined
let b = 456;
let
與const
宣告的變數在這個例子裡並無hoisting
的跡象,但在爬其他大大的文的過程中,發現這個說法有爭議,其中有論述是let
與const
其實是會hoisting
的。
這邊引用eyesofkids 大大的文章:
有些人會認為
let
與const
不會被提升,實際上是會的。因為它們被定義有一段時間是無法存取的,這是在被宣告與進入作用域之間時,這段時間稱為Temporal Dead Zone
(TDZ, 時間死區),所以不同於var
或function
,存取let
或const
提升的變數/常數會產生錯誤ReferenceError
,而不是undefined
。
附上連結:Day 05: ES6篇 - let與const - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
大大這篇講得很詳細,雖然對我來說有點深奧 (汗,有興趣直接連過去看,然後我這篇就不要看了XD
let a = 123;
a=345; //345
const b = 678;
b=567; //Uncaught TypeError: Assignment to constant variable.
從上面例子可以看到,let
宣告的變數值是可以改變的,const
不行。
但如果是像物件或是陣列類型的值,是可以被改變的:
const test={
name:"mary",
age:"35"
}
test.age=8;
console.log(test.age) //8
也就是說const
是不允許將整個test
變成是另一個東西(reassigned
),但可以允許變更裡面的內容。
今天學習ES6的變數宣告,明天開始學習ES6 object shorthand