Post

JavaScript null、undefined、undeclared 差別

在 JavaScript 中,nullundefinedundeclared 都代表不同的概念和用法。以下是它們的區別:

null

  • 類型:object
  • 意義:null 表示一個有意的空值,通常用來表示變數應該有值但目前是空的
  • 使用場景:
    • 當你想明確表示某個變數沒有值時,可以將它設為 null
    • 清除引用,方便做 Garbage Collection (GC)

表示有意的空值

1
2
3
4
let user = null; // 明確表示 user 目前沒有值

console.log(user); // null
console.log(typeof user); // object

清除引用

1
2
3
let data = { key: "value" };
// 使用完 data 後
data = null; // 清除引用,便於垃圾回收

undefined

  • 類型:undefined
  • 意義:undefined 表示變數沒有被宣告,或是已經宣告但尚未賦值
  • 使用場景:
    • 當變數被宣告但沒有被賦予值時,自動初始化為 undefined
    • 函數沒有 return 語句時也會返回 undefined

宣告了,但是還沒有賦值

1
2
3
4
5
6
var a = undefined;
console.log(a); // undefined
console.log(typeof a); // undefined

var b;
console.log(b); // undefined

物件沒有該屬性

1
2
3
4
var person = {
  name: "elaine",
};
console.log(person.age); // undefined

函式沒有回傳值

1
2
function sayHi() {}
console.log(sayHi()); // undefined

呼叫函式,沒有帶入參數

1
2
3
4
function sayHi(name) {
  console.log(name); // undefined
}
sayHi();

undeclared

  • 意義:undeclared 表示變數尚未宣告。在使用未宣告變數時會引發 ReferenceError 錯誤
  • 使用場景:
    • 當試圖訪問或操作一個未經宣告的變數時,會產生這種錯誤。這通常是由於拼寫錯誤或變數作用域問題引起的

未宣告直接取值會噴錯

1
console.log(a); // Uncaught ReferenceError: a is not defined

在嚴格模式,沒有宣告變數就直接賦值,會噴錯 Uncaught ReferenceError: a is not defined

1
2
"use strict";
a = 10; // 嚴格模式,Uncaught ReferenceError: a is not defined

在非嚴格模式,沒有宣告變數就直接賦值,該變數會變成全域變數

1
2
a = 10; // 非嚴格模式,直接賦值 a,a 會變成全域變數
console.log(a); // 10

Best Practice

避免手動設置 undefined

儘量避免手動將變數設置為 undefined,因為這是 JavaScript 的默認值。當需要表示未定義狀態時,考慮使用 null 或其他更具描述性的值

1
2
var a = undefined; // 不推薦
var a = null; // 更具描述性

函式參數的默認值

使用函式參數的默認值來避免未定義的情況

1
2
3
4
function greet(name = "Guest") {
  console.log(`Hello, ${name}!`);
}
greet(); // 輸出: Hello, Guest!

使用嚴格模式

使用嚴格模式 (strict mode) 可以幫助捕捉未宣告變數的錯誤,從而避免未預期的全域變數

1
2
3
4
5
6
"use strict";
try {
  a = 10; // 會引發 ReferenceError
} catch (error) {
  console.log(error.message); // 輸出: a is not defined
}
This post is licensed under CC BY 4.0 by the author.