JavaScript 核心觀念(7)-執行環境與作用域-not defined VS undefined
前言
not defined
以及 undefined
也是 JavaScript 中相當重要的觀念,若可以搞懂這兩者的差異,對於 debug 上是非常有幫助的。
not defined
在前面章節中我們知道 JavaScript 有一個所謂的提升(注意,JavaScript 實際上並沒有這個東西,這只是為了釐清 JavaScript 的一種說法。),因為有這個狀況的發生,所以當我們在宣告變數之前呼叫變數是只會出現 undefined
。
1 | console.log(a); // undefined |
而 not defined
是如何發生的呢?只需要將 var a = 'Ray';
註解即可。
1 | console.log(a); // a is not defined |
因此我們可以了解到 not defined
的意思是這個「變數或函式未定義」。
當我們在開發時若出現 XXX not defined
就代表你變數或函式忘記宣告啦~~
undefined
undefined
在前面已經講過很多次了,undefined
是屬於一個特殊關鍵字,通常會發生在提升的時候,因此在這邊有一個重點要補充。
千萬不要針對變數給予 undefined
,因為在 JavaScript 中是允許你這樣做的(WTF?)
1 | var a = undefined; |
當若你使用 undefined
當作一個值來使用,那麼你就很容易導致自己在開發以及 Debug 的困擾,因為你根本不知道變數到底被賦予值了沒有,因此若你真的想要賦予變數一個初始空值,那就會建議你使用 null
,null
就是字面上翻譯空值的意思,使用這個方式來賦予空值,會比你使用 undefined
當作初始值來的好太多,也可以避免你被請出門喝咖啡。
但是這邊額外講一下 null
並不能等於 ''
空字串,因為這兩者在 JavaScript 中是不同的東西,因此不能拿來做比較
1 | '' == null; // false |
這時候我們也可以使用 typeof
來查看為什麼會不能相等以及各自型別是什麼
1 | typeof(''); // string |
null
會顯示 object 這個原因是 JavaScript 長久以來的 Bug,也因為 JavaScript 已經這樣子運行很久了,若隨意修正這個 Bug 可能會發生全世界的網站都掛掉的問題,所以這個 Bug 才會一直存活在 JavaScripr 中。
最後除了不要將 undefined
當作變數的值之外,也千萬不要拿來當作變數名稱使用,因為 JavaScript 是允許你這樣做的,但並不能正常運作。
1 | var undefined = '1'; |
所以 undefined
的重點有兩個,不要當作變數屬性以及當作變數名稱使用,否則你會被請出去喝咖啡。