一、必須使用===
來檢查undefined
===
(嚴格相等)運算符來比較 x
是否等於 undefined
,因為 x == undefined
會同時檢查 x
是否為 null
,而這不是我們想要的行為。這是因為在 JavaScript 中,null
和 undefined
是不同的值。==
運算子會將null 和undefined 視為相同 ;===
則是將null 和undefined 視為不同,所以必須要用===
來區分他們。let x;
if (x === undefined) {
// these statements execute
} else {
// these statements do not execute
}
二、使用typeof 搭配 if else 檢視undefined
typeof 檢視型別為undefined:
let x;
if (typeof x === "undefined") {
// 執行這裡的計算
}
三、沒有宣告變數,使用typeof 及if else 可正常執行
沒有宣告變數,使用typeof 也不會跳出error:
沒有宣告變數,但如果不使用typeof ,直接報錯:x is not defined
// x has not been declared before
if (typeof x === "undefined") {
// these statements execute
}
// 報錯
if (x === undefined) {
}
四、使用 in 方式來檢查變數是否在全域內
如果x沒有宣告過,使用in方式測試x是不是在全域作用域(global scope),結果是沒有。
if("x" in window){b=2}else{b=3}; //b=3
x有宣告過:
let x;
if(x in window){b=6}else{b=7}; //b=6
五、void是什麼?
void是JavaScript一個運算子,接收任意的運算式或值,然後回傳undefind。
用法與 typeof
一樣,可以在後面加上小括號 ()
或是直接加上某個值:
void 0; // undefined
void(0); // undefined
用void直接回傳undefined的範例:
let x;
console.log(x); // undefined
let y = void 0;
console.log(y); // undefined
let z = void "Hello";
console.log(z); // undefined
let a = void (2 + 3);
console.log(a); // undefined
六、宣告與否,與void
之間的關係void 0
是一種獲取 undefined
值的方式,因此這個檢查是檢查變數 x
是否為 undefined
。
如之前有宣告,將x使用void設定為undefined後,if else 可正常執行:
let x; //宣告x
if (x === void 0) {
// (x === void 0)為true,運算可執行
}
之前沒有宣告,使用void會直接報錯:
// y 未宣告過
if (y === void 0) {
// 報錯: y is not defined
}
Reference
https://medium.com/itsems-frontend/javascript-scope-and-scope-chain-ca17a1068c96
https://kuro.tw/posts/2019/08/04/JS-%E5%86%B7%E7%9F%A5%E8%AD%98-%E4%BD%A0%E6%89%80%E4%B8%8D%E7%9F%A5%E9%81%93%E7%9A%84-void/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined