JavaScript Weird Part (5) - JavaScript 與 undefined

建立執行環境的第一階段「創造階段」,會在全域環境裡產生一個全域物件及一個特殊的變數 this;如果有外部環境,也會產生連結到外部環境的連結;以及「提昇」(hositing) 的特殊現象,為函數及變數在記憶體裡建立空間,此時變數的初始值被設定為 undefined

1
2
var a;
console.log(a);

在瀏覽器查詢的結果會是 undefined

undefined 是什麼意思呢?undefined 其實是一種 Javascript 內建特殊的值,表示這個變數還沒被設定值。我們可以用以下範例來檢查這個特殊值的存在:

1
2
3
4
5
6
7
8
9
10
var a="hello world";
console.log(a);

a=undefined;

if(a===undefined){
console.log("a is undefined");
}else{
console.log("a is defined");
}

變數 a 的值確實是 undefined,因為當執行環境被創造時,會設定所有的變數的初始值為 undefined。

這和從未宣告變數不同,假使去掉宣告關鍵字 var

1
console.log(a);

上圖顯示:產生錯誤,a is not defined。兩者的差異是什麼呢? 因為變數未被宣告,因此出現「無法參照」的錯誤。這是因為創造執行環境的創造階段,沒有找到var a ,所以它從未在記憶體中出現過。所以對於電腦來說,執行這段程式碼之後回應「我沒有在記憶體中找到 a 這個值」。

當我宣告 var aa 在創造階段就被放進記憶體,執行環境把 var a 放進記憶體,所以雖然我們沒有給變數一個值,Javascript 已經在底層完成許多工作。

所以 undefined 並不代表空的或還沒定義、不存在,事實上是「一種會佔據記憶體空間的值」,表示這是 Javascript 設定的初始值,

為了方便學習記憶,也可以稱為「未設定」(not set)

雖然我們可以給變數一個 undefined 的值,但永遠不要如此設定變數

1
2
3
4
5
6
7
8
9
10
var a = "hello world";
console.log(a);

a = undefined;

if (a === undefined) {
console.log("a is undefined");
} else {
console.log("a is defined");
}

雖然這在 Javascript 裡是有效的,但最好把這個特殊的值,留給 Javascript 的原始設定,以避免這種混淆的危險。因為如果濫用 undefined,會無法分辨是自己設定的還是 Javascript 所設定的。最好讓 undefined 永遠表示「我從未設定這個值」,這對除錯將有相當大的幫助。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2020 CYC'S BLOG All Rights Reserved.

UV : | PV :