What does `void 0` mean?
Possible Duplicate:
What does “javascript:void(0)” mean?
通过Backbone.js源代码阅读,我看到了这个:
1
| validObj[attr] = void 0; |
什么是void 0? 在这里使用它的目的是什么?
void 0是什么意思?
void [MDN]是一个前缀关键字,它接受一个参数并始终返回undefined。
例子
1 2 3 4 5
| void 0
void (0)
void"hello"
void (new Date())
//all will return undefined |
那是什么意思?
看起来很没用,不是吗?如果它总是返回undefined,那么仅使用undefined本身有什么问题?
在完美的世界中,我们可以安全地使用undefined:它比void 0更简单易懂。但是如果你以前从未注意过,这不是一个完美的世界,尤其是涉及到Javascript时。
使用undefined的问题是undefined不是保留字(它实际上是全局对象[wtfjs]的属性)。也就是说,undefined是允许的变量名,因此您可以根据自己的价格为其分配新值。
1 2 3
| alert(undefined); //alerts"undefined"
var undefined ="new value";
alert(undefined) // alerts"new value" |
注意:这在任何支持ECMAScript 5或更新版本的环境中都不再是问题(即实际上除了IE 8之外的所有环境),它将全局对象的undefined属性定义为只读(因此它只能用于阴影)您自己的本地范围内的变量)。但是,此信息对于向后兼容性目的仍然有用。
1 2 3 4 5 6
| 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? 0有什么特别之处?难道我们不能轻易使用1,42,1000000或"Hello, world!"吗?
答案是,是的,我们可以,而且它也会起作用。传递0而不是其他一些参数的唯一好处是0是短的并且是惯用的。
为什么这仍然相关?
虽然undefined通常可以在现代JavaScript环境中受到信任,但void 0有一个微不足道的优点:它更短。在编写代码时,差异是不够的,但是它可以在大型代码库中添加足够的代码,大多数代码缩减器将undefined替换为void 0以减少发送到浏览器的字节数。
-
@Randomblue我编辑回答你的评论
-
@PeterOlson void 0的主要好处是0是使用void生成undefined值的事实上的标准。
-
首先,undefined不是关键字,它只是全局对象的属性。其次,在ECMAScript5中,它是写保护的,因此只有在某个函数中使用undefined作为局部变量时,void 0技巧才是必要的。
-
@ Pumbaa80除非你使用严格模式,否则这个技巧是必要的,因为大多数浏览器都允许undefined进行变异。
-
但为什么需要一个参数呢?排除表达的任何有用例子?为什么无效0?而不是无效1?
-
@AntonN可能存在一些可能的用例,您希望执行具有副作用但忽略返回值的函数。
-
所以这与if (typeof options.something === 'undefined')基本相同,我以前记得从SO是检查undefinedness的安全模式?
-
@Sam不是,void x总是返回undefined。 typeof x ==="undefined"检查x是否未定义。
-
另一种常见模式是在立即函数中提供undefined作为参数:(function(undefined){ ... }())这对于缩小特别有用。
-
哪个JS引擎允许更改undefined的值?
-
@RobertCambridge我认为它是ES5规范所要求的,因此大多数JS引擎都应该允许它。
-
有趣的是当前版本的Chrome和Firefox不适用! :)
-
@RobertCambridge是的,他们这样做
-
粘贴到控制台时,相同的代码会发出undefined警报。我看到在控制台发生奇怪的事情,不记得为什么或我在哪里阅读它!很高兴知道。
-
@PeterOlson,在您展示的示例中,您正在创建一个隐藏全局变量的新局部变量。无法重新分配全局undefined。问题似乎是undefined不是保留关键字。在没有var前缀的情况下再次尝试你的小提琴,使其成为一个赋值而不是声明。
-
@RobertCambridge,请参阅我之前的评论,以澄清为什么它在Chrome控制台中不起作用。最初的小提琴是用当地人隐藏全球。我同意您的观点,undefined无法在当前的Chrome或Firefox版本中重新分配。
-
@DrewNoakes它不是局部变量,因为我在全局范围内定义它。但是,你是对的,问题不是undefined正在改变,而是一个变量正在影响它。
-
@PeterOlson,它是你链接到的jsFiddle中的局部变量,因为jsFiddle将代码包装在一个函数ala:window.onload = function() { var undefined = 4; alert(undefined); }中。尝试在Chrome,Firefox和Node.JS上影响全局,似乎对我不起作用。
-
似乎void undefined会比void 0稍微清楚,不是吗?
-
@finiteloop它也可以正常工作,但它更长,可能更令人困惑,因为void 0是一个广为人知的Javascript习惯用法,而void undefined则不太常见,可能会让人们更多地思考它。
-
@PeterOlson是的,你可能是对的。你可以想象我最终在这个帖子上因为我之前没有看过0,但是现在我已经看到了,我同意你的推理。
-
好的,为什么void 0而不仅仅是void?
-
@WORMSS因为void需要一个参数,所以在它之后没有任何东西使用它会是语法错误。
-
@PeterOlson是的,我知道,但我的意思是,为什么无效需要一个论证,因为你传递给它的并不重要?
-
@WORMSS这是语言设计者的问题;我不知道
-
理解你在答案中所说的内容,但我不明白的是,为什么void关键字需要参数? 无论如何它返回undefined,那么为什么不把它留作return void而已呢?
-
有趣的事实:因为"undefined"可以是变量名,在这种情况下你可以获得ReferenceErrors:(() => {'use strict';alert(undefined);let undefined = 2;}())(因为"undefined"指的是下一行中的局部变量,而不是全局属性)。
void 0返回undefined,并且在覆盖undefined时无法覆盖。
-
ECMAScript 5将undefined定义为只读
-
@licancabur:我认为这只是严格模式代码,是吗?
-
哇,我一直在投票。 当这张贴在3年前发布时,浏览器允许您将undefined设置为任何值。
-
是时候更新你的答案了。
-
如果答案随着时间的推移变得多余,为什么不应该倾向于支持更新的答案呢?
-
@epascarello,虽然你所写的内容是正确的(不知何故),但我不认为它回答的问题(足够清楚)就是在问这是什么意思。
void是保留的JavaScript关键字。它计算表达式并始终返回undefined。
-
它可能比undefined短,并且保证返回它(与全局可重写undefined不同)。