iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 20
0
Modern Web

JavaScript Note系列 第 20

var & let & const

  • 分享至 

  • xImage
  •  

在JavaScript中,我們會使用3種關鍵字來宣告變數:var、let、const,它們的使用情境與產生的運算結果有所不同,以下就來一一介紹。

const

宣告時必須同時設定其值,一旦給值之後,就不能再更改其值。

const x;

宣告未給值:
https://ithelp.ithome.com.tw/upload/images/20181104/20112573AASLmbNgAx.png
宣告後,改變值:
https://ithelp.ithome.com.tw/upload/images/20181104/20112573v8lv8Ml0E5.png
當我們希望特定變數經設定後,不允許在執行過程中改變,就必須用const。

使用const建立物件

建立物件後,無法再指派新物件給它。
雖然一樣是空物件,但實際上,是指向不同記憶體位置的物件。

const person = {};
person = {}; 

https://ithelp.ithome.com.tw/upload/images/20181104/20112573cWQbdOp4P7.png

但可以修改物件內容:

person.name = 'Mary';
console.log(person.name); //Mary

陣列也是同樣的情況:

const ary = [];
ary = [];

https://ithelp.ithome.com.tw/upload/images/20181104/20112573g0XQi0CvxV.png

ary.push('Mary');
console.log(ary[0]); //Mary

為什麼物件跟陣列可以修改其內容,而基本型別卻不行呢?

因為物件跟陣列是屬於參考型別,在JavaScript中參考型別是可變的,而且物件跟陣列變數的內容並不是真正的值,而是一個記憶體位址,指向實際的值,所以如果重新指向其他物件,等同於修改變數的值,const是不允許的。

只要記住,const變數只能在宣告時一併給值,之後就不能再改變它了。

var

相信各位看到var是再熟悉不過了,JavaScript是弱型別的程式語言,在ES6之前,變數宣告只需用var就一切搞定,這樣的語言特性,讓很多初學者產生誤解,以為JavaScript是很簡單又容易上手的語言。

是的,這話沒有說錯,但如果繼續深入研究,我想很多人要對以上那句話打問號了,尤其是後端程式語言開發者。

var name = 'Mary';
function sayHello() {
    var greeting = 'Hello!';
    for (var i = 0; i < 3; i++) {
        var msg = `${greeting} ${name}`;
        console.log(`msg:${msg}`); //msg:Hello! Mary
        console.log(`i:${i}`); //i:0 i:1 i:2
    }
    console.log(`msg:${msg}`); //msg:Hello! Mary
    console.log(`i:${i}`); //i:3
}
sayHello();

上面的範例在for迴圈中,可以正常存取msg與i變數,這個很正常。
但在for迴圈的區塊外,依然可以正常存取msg與i變數,這對於後端程式語言開發者來說的確是很奇怪。

這是因為var關鍵字,是以函式區塊為範圍,所以整個sayHello( )都可以存取for迴圈內的變數,一旦出了sayHello( )就無法存取函式內的變數了。

在函式外執行:

console.log(`msg:${msg}`);
console.log(`i:${i}`);'

會發生錯誤:
https://ithelp.ithome.com.tw/upload/images/20181104/20112573LPMliGycf8.png
https://ithelp.ithome.com.tw/upload/images/20181104/20112573Lime7xLkX7.png

所以上面的例子我們擁有3個作用域環境:

  • 全域環境。
  • sayHello( )環境,包含了greeting、msg、i,3個變數。
  • for迴圈環境。因為裡面的變數使用var宣告,所以會忽略此環境。

因為var關鍵字會帶來一些問題,所以在ES6提供了const與let的宣告關鍵字。

let name = 'Mary';
function sayHello() {
    let greeting = 'Hello!';
    for (let i = 0; i < 3; i++) {
        let msg = `${greeting} ${name}`;
        console.log(`msg:${msg}`); //msg:Hello! Mary
        console.log(`i:${i}`); //i:0 i:1 i:2
    }
    console.log(`msg:${msg}`); //Uncaught ReferenceError: msg is not defined
    console.log(`i:${i}`); //Uncaught ReferenceError: i is not defined
}
sayHello();

如果將var換成let的話,會發現變數msg、i只能在for迴圈內部存取了。
所以之後盡可能的話,就使用let來取代var吧。

參考來源:
忍者:JavaScript開發技巧探秘


上一篇
call函式 & arguments物件
下一篇
Exception handling 例外處理
系列文
JavaScript Note31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言