iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
0
自我挑戰組

從0開始vue.js的30天學習日誌系列 第 13

13 JavaScript ES6 - 變數宣告let, const

ES6的寫法可以讓JavaScript 變得更簡化、閱讀性更高,現在也有越來越多開源範例還有教學使用ES6,並用Babel來轉換成ES5,而課程也會使用到ES6 ( 其實前幾篇也有用到,只是先跳過了QQ ),所以從現在開始之後的幾篇會有ES6的筆記。

宣告變數的新方式let 與 const

letconst有以下三個特點:

作用域與var不同

let:宣告的變數是可以改變的
const:宣告出來的變數不能被reassinged

letconstvar的差別是在作用域不同,letconst是限制在他本來宣告的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宣告,作用域外就讀不到這個變數了。

總結:

letconst是區塊作用域(block scope),而var是函式作用域(function scope)

Hoisting

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;

letconst宣告的變數在這個例子裡並無hoisting的跡象,但在爬其他大大的文的過程中,發現這個說法有爭議,其中有論述是letconst其實是會hoisting的。
這邊引用eyesofkids 大大的文章:

有些人會認為letconst不會被提升,實際上是會的。因為它們被定義有一段時間是無法存取的,這是在被宣告與進入作用域之間時,這段時間稱為Temporal Dead Zone(TDZ, 時間死區),所以不同於varfunction,存取letconst提升的變數/常數會產生錯誤ReferenceError,而不是undefined

附上連結:Day 05: ES6篇 - let與const - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
大大這篇講得很詳細,雖然對我來說有點深奧 (汗,有興趣直接連過去看,然後我這篇就不要看了XD

Const 不能變 ?!

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


上一篇
12 Vue的模板語法 - 迴圈 v-for (2) 使用<tamplate>
下一篇
14 JavaScript ES6 - 物件縮寫object shorthand
系列文
從0開始vue.js的30天學習日誌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言