我应该在JavaScript中使用`void 0`还是`undefined`?

60

在JavaScript中,我应该使用void 0还是undefined来取消赋值,例如:

event.returnValue = void 0;
或者
event.returnValue = undefined;

1
没有区别。void 0 总是返回 undefined。 - user1508519
@RecoveringSince2003,returnValue 可能包含一个字符串,例如 onbeforeunload - avo
1
@user2736012,你呢? - avo
我理解得足够好,不会重新定义 undefined 的值。这就是所需的全部。 - user2736012
2
如果您的模块是自包含的,那么您可以采取措施确保在旧浏览器中运行时,即使允许将undefined全局设置为其他值,模块内部undefined实际上仍具有值undefined。@user2736012 - 关键是(在旧浏览器中),一些其他包含的库可能会潜在地更改undefined作为全局变量的值,因此不能完全安全地假定undefined始终实际上具有值undefined - nnnnnn
显示剩余14条评论
3个回答

84

如果你使用的是现代浏览器(支持JavaScript 1.8.5),使用undefinedvoid 0可能会产生相同的结果(因为undefined被设置为不可写),除了void可以接受表达式作为参数并对其进行评估。

在旧版浏览器中(不支持JavaScript 1.8.5),最好使用void 0。看下面这个例子:

console.log(undefined);
var undefined = 1;
console.log(undefined);

它将打印
1

undefined实际上是一个全局属性,而不是关键字。因此,可以更改undefined,而void是一个运算符,在JavaScript中无法被覆盖,并始终返回值undefined。只需查看我今天早些时候为类似问题提供的答案Why does void in Javascript require an argument?

结论:

因此,如果您关心兼容性,最好使用void 0


2
虽然它是一个变量,但在ES5中被赋予了[[Writable]]:false。因此,这个例子只在基于ES3的引擎中有效,比如IE 8及更早版本的浏览器。 - Jonathan Lonowski
1
@JonathanLonowski 取决于范围... - canon
@JonathanLonowski 指出了 undefined 是不可写的事实。感谢您指出。请检查。 - thefourtheye
1
请注意,仍有很多人在使用IE8(例如,我的雇主强制要求我使用它),所以安全起见最好不要忽视它。 - nnnnnn
1
我不认为兼容性是一个问题。虽然在旧环境中可能会被覆盖,但实际上没有人这样做。我认为使用undefined更好,因为a)它更清晰,b)你可以很容易地将其变成可压缩的变量。 - Bergi
显示剩余2条评论

14
"

"void 0"更加安全。"undefined"是一个值,像任何其他值一样。可能会将该值重写为另一个值:

undefined = 3;

如果您使用了undefined,那么事件returnValue的含义会发生变化。不过,“void”是一个关键字,其含义无法改变。“void 0”始终会返回undefined值。


4
在任何现代浏览器中都不是这样。 - Colin DeClue
1
@ColinDeClue 取决于 作用域... - canon
@canon:那么,如果您编写了正确作用域的代码,别人就无法覆盖undefined了? - Colin DeClue
1
“更安全”?谁在自己的页面上覆盖它就是傻瓜,这是他自己的错。如果别人可以在您的页面上覆盖它,则表示您面临着更严重的问题。 - Bergi
2
@Bergi 我注意到你在你的示例中仍在使用 void 0。:) 当然你不必这样做--一旦你使用一个函数,你可以这样做 (function(undefined) { /* 在这里使用 'undefined' */ })(); (不传递参数会得到 undefined 的值),或者这样:(function() { var undefined = (function(){})(); /* 在这里使用 'undefined' */ })(); 关键是,有很多方法可以获得 undefined 的值。void 0 比没有函数作用域的 undefined 更加安全。 - Zach
显示剩余4条评论

1
“void”运算符通常仅用于获取未定义的原始值,通常使用“void(0)”(相当于“void 0”)。在这些情况下,可以使用全局变量undefined代替(假设它尚未分配给非默认值)。

https://dev59.com/_HM_5IYBdhLWcg3wp0wX#1291950

只需使用undefined,因为它们都将被评估为它。


我同意在普通代码中只使用undefined,但并不总是两者都会评估为undefined。此答案也没有讨论为什么会使用一种替代方案而不是另一种,这确实有实际的理由。 - Waleed Khan
@Khan 这个用户和另一个用户基本上是从其他问题中复制/粘贴的。 - user1508519

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接