JavaScript 核心觀念(7)-執行環境與作用域-not defined VS undefined

前言

not defined 以及 undefined 也是 JavaScript 中相當重要的觀念,若可以搞懂這兩者的差異,對於 debug 上是非常有幫助的。

not defined

在前面章節中我們知道 JavaScript 有一個所謂的提升(注意,JavaScript 實際上並沒有這個東西,這只是為了釐清 JavaScript 的一種說法。),因為有這個狀況的發生,所以當我們在宣告變數之前呼叫變數是只會出現 undefined

1
2
console.log(a); // undefined
var a = 'Ray';

not defined 是如何發生的呢?只需要將 var a = 'Ray'; 註解即可。

1
2
console.log(a); // a is not defined
// var a = 'Ray';

因此我們可以了解到 not defined 的意思是這個「變數或函式未定義」。

當我們在開發時若出現 XXX not defined 就代表你變數或函式忘記宣告啦~~

undefined

undefined 在前面已經講過很多次了,undefined 是屬於一個特殊關鍵字,通常會發生在提升的時候,因此在這邊有一個重點要補充。

千萬不要針對變數給予 undefined,因為在 JavaScript 中是允許你這樣做的(WTF?)

1
var a = undefined;

當若你使用 undefined 當作一個值來使用,那麼你就很容易導致自己在開發以及 Debug 的困擾,因為你根本不知道變數到底被賦予值了沒有,因此若你真的想要賦予變數一個初始空值,那就會建議你使用 nullnull 就是字面上翻譯空值的意思,使用這個方式來賦予空值,會比你使用 undefined 當作初始值來的好太多,也可以避免你被請出門喝咖啡。

但是這邊額外講一下 null 並不能等於 '' 空字串,因為這兩者在 JavaScript 中是不同的東西,因此不能拿來做比較

1
2
3
'' == null; // false

'' === null; // false

這時候我們也可以使用 typeof 來查看為什麼會不能相等以及各自型別是什麼

1
2
3
typeof(''); // string

typeof(null); // object

null 會顯示 object 這個原因是 JavaScript 長久以來的 Bug,也因為 JavaScript 已經這樣子運行很久了,若隨意修正這個 Bug 可能會發生全世界的網站都掛掉的問題,所以這個 Bug 才會一直存活在 JavaScripr 中。

最後除了不要將 undefined 當作變數的值之外,也千萬不要拿來當作變數名稱使用,因為 JavaScript 是允許你這樣做的,但並不能正常運作。

1
2
var undefined = '1';
undefined // undefined

所以 undefined 的重點有兩個,不要當作變數屬性以及當作變數名稱使用,否則你會被請出去喝咖啡。

參考文獻