`void 0` 是什么意思?

596

我阅读了 Backbone.js 的源代码,看到了这段代码:

validObj[attr] = void 0;

void 0是什么?在这里使用它有什么目的?


13
关于 "void(0)" 的相关问题并没有很清楚地说明 void 是一个具有独特语法的特殊关键字。在我发现这个问题之前,我不知道 void(0)void 0 是同一个关键字。 - Coderer
3个回答

1182

void 0是什么意思?

void[MDN]是一个前缀关键字,接受一个参数并总是返回undefined

示例

void 0
void (0)
void "hello"
void (new Date())
//all will return undefined

这有什么意义呢?

看起来挺没用的,是吗?如果它始终返回undefined,那么只使用undefined本身有什么问题呢?

在理想情况下,我们可以安全地只使用undefined:它比void 0更简单易懂。但是,也许你之前从未注意过,这不是一个完美的世界,尤其是在处理JavaScript时。

使用undefined的问题在于undefined不是保留字(实际上是全局对象的属性[wtfjs])。也就是说,undefined是一个允许的变量名,因此您可以任意为其赋值。

alert(undefined); //alerts "undefined"
var undefined = "new value";
alert(undefined) // alerts "new value"

注意:在支持ECMAScript 5或更新版本的任何环境中(即实际上除了IE 8以外的所有地方),这已不再是问题。ECMAScript 5将全局对象的 undefined 属性定义为只读属性(因此只能在本地作用域中隐藏该变量)。但出于向后兼容性的目的,此信息仍然很有用。

alert(window.hasOwnProperty('undefined')); // alerts "true"
alert(window.undefined); // alerts "undefined"
alert(undefined === window.undefined); // alerts "true"
var undefined = "new value";
alert(undefined); // alerts "new value"
alert(undefined === window.undefined); // alerts "false"
void无法被覆盖,而void 0将始终返回undefined。另一方面,undefined可以是Javascript先生想要的任何内容。为什么特别使用void 0?之所以使用void 0是因为它很短而且习惯用语化。虽然在现代JavaScript环境中,通常可以信任undefined,但void 0有一个微不足道的优点:它更短。这种差异在编写代码时无需担心,但在大型代码库中可以累积到足够多,以至于大多数代码缩小器将undefined替换为void 0以减少发送到浏览器的字节数。

7
为什么它需要一个参数?有哪些有用的示例可以使表达式无效?为什么使用 void 0 而不是 void 1? - Anton N
4
不是很准确,void x 总是返回未定义。typeof x === "undefined" 检查 x 是否未定义。 - Peter Olson
5
另一种常见的模式是在立即执行函数中作为参数提供 undefined(function(undefined){ ... }())。这对于代码压缩特别有用。 - AvL
2
有趣的是,当前版本的Chrome和Firefox不会这样! :) - rcambrj
2
@PeterOlson 是的,我知道这一点,但我的意思是,为什么 void 需要一个参数,因为你传递什么并不重要? - WORMSS
显示剩余21条评论

128

void 0返回undefined且不可被覆盖,而undefined可以被覆盖。

var undefined = "HAHA";

30
ECMAScript 5将undefined定义为只读。 - licancabur
2
@licancabur:我相信这只适用于严格模式的代码,是吗? - crowder
68
哇,我一直在这个帖子上被踩。当这个帖子发布三年前时,浏览器允许您将未定义的值设置为任何值。 - epascarello
13
如果一个回答随着时间的推移变得过时,为什么不应该将其下投票以支持更新的答案? - ESR
@epascarello,虽然你所写的是正确的(在某种程度上),但我认为它并没有清晰地回答问题——那个问题是在问那意味着什么。 - AaA

42

void是JavaScript中的一个保留关键字。它评估表达式并始终返回undefined


8
它可能比 "undefined" 更短,并且保证返回它(不像全局可重写的 "undefined")。 - Digital Plane

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