我阅读了 Backbone.js 的源代码,看到了这段代码:
validObj[attr] = void 0;
void 0
是什么?在这里使用它有什么目的?
我阅读了 Backbone.js 的源代码,看到了这段代码:
validObj[attr] = void 0;
void 0
是什么?在这里使用它有什么目的?
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
以减少发送到浏览器的字节数。void x
总是返回未定义。typeof x === "undefined"
检查 x
是否未定义。 - Peter Olsonundefined
:(function(undefined){ ... }())
。这对于代码压缩特别有用。 - AvLvoid 0
返回undefined且不可被覆盖,而undefined
可以被覆盖。
var undefined = "HAHA";
void
是JavaScript中的一个保留关键字。它评估表达式并始终返回undefined
。
void
是一个具有独特语法的特殊关键字。在我发现这个问题之前,我不知道void(0)
和void 0
是同一个关键字。 - Coderer