原文:JavaScript quirk 2: two “non-values” – undefined and null
譯文:「譯」JavaScript 的怪癖 2:兩個「空值」:undefined 和 null
譯者:SingleSeeker
對於“空值”或“Null 參考”,大多數程式設計語言只有一個值。比如,在 Java 中用的是 null。 但是在 Javascript 中卻有兩個特殊的值:undefined 和 null。 他們基本上是相同,但用法上卻略有些不同。 在這個 系列教程 的最後,我會解釋一下在 ECMAScript 6 中的一些變化。
undefined 是被語言本身所分配的。 如果一個變數還沒有被初始化,那麼它的值就是 undefined:
> var foo;> fooundefined
同理,當缺失參數時 JavaScript 會分配一個 undefined:
> function id(x) { return x }> id()undefined
null 是被開發人員用來明確指出某個值是缺失的, 例如,對於 JSON.stringify():
> console.log(JSON.stringify({ first: 'Jane' }, null, 4)){ "first": "Jane"}
校檢:一個變數是否有值?
如果你想知道變數 v 是否有值,正常情況下,你需要同時檢驗 undefined 與 null。 幸運的是兩個值都是 false 型。 因此,只用一個判斷,就可以同時檢驗這兩項是否為真:
if (v) { // v 有值} else { // v 沒有值}
在本 系列 的第 5 部分——關於函數參數的處理——你將會看到更多的上面校檢例子。 有一點要注意的是:這個檢查也會把 false,-0, +0, NaN 與 '' 當成“空值”。 如果這不是你想要的,那麼就不能使用上面的校檢方法了。
你有兩個選擇。
有些人提倡使用不等於(!=)來校檢 v 既不是 undefined 或 null:
if (v != null) { // v 有值} else { // v 沒有值}
不過,這要求你要明白 != 認為 null 只等於它自己或是 undefined。 我喜歡用更有可讀性的 !==
if (v !== undefined && v !== null) { // v 有值} else { // v 沒有值}
效能方面,所有在這個章節中提到的這三個校檢基本是相同的。 所以,最後用哪個取決於你的需求還有你的品味。 一些壓縮公用程式甚至用!= 重寫了最後一條校檢。