在 JavaScript 中,void 0 和 undefined 都可以用来表示一个未定义的值,但它们在语法和语义上有细微的差别。
undefined
- 全局变量:undefined 是 JavaScript 的一个全局属性,表示一个变量未被赋值时的默认值。
- 类型:typeof undefined 返回 “undefined”。
使用场景:
- 检查变量是否未定义:if (typeof someVar === ‘undefined’) { … }
- 函数参数未传入时的默认值:function foo(x = undefined) { … }
void 0
-
表达式:void 0 是一个表达式,void 运算符会忽略其操作数并返回 undefined。
-
类型:typeof void 0 也返回 “undefined”。
使用场景:
- 明确返回 undefined:return void 0;
- 在需要明确返回 undefined 的地方使用,以避免潜在的变量名冲突。
主要区别
语法差异:
- undefined 是一个全局变量。
- void 0 是一个表达式。
可重写性:
- undefined 可以被重写(尽管在严格模式下会报错):
// 严格模式下会报错
'use strict';
undefined = 42; // TypeError: Cannot assign to read only property 'undefined' of object '#<Window>'
```
void 0 不是一个变量,因此不能被重写。
代码清晰度:
使用 void 0 可以更明确地表示你希望返回 undefined,而不是依赖于全局变量 undefined。
// 使用 undefined
let a;
console.log(a); // undefined
console.log(typeof a); // "undefined"
// 使用 void 0
let b = void 0;
console.log(b); // undefined
console.log(typeof b); // "undefined"
// 尝试重写 undefined
try {
undefined = 42;
} catch (e) {
console.error(e); // TypeError: Cannot assign to read only property 'undefined' of object '#<Window>'
}
// void 0 不能被重写
try {
void 0 = 42; // SyntaxError: Unexpected token '='
} catch (e) {
console.error(e); // SyntaxError: Unexpected token '='
}
总结来说,虽然 void 0 和 undefined 在大多数情况下可以互换使用,但在需要明确返回 undefined 或避免潜在变量名冲突的情况下,使用 void 0 是更好的选择。