JavaScript中的void运算符有什么意义?

mko*_*yak 55 javascript void

我见过一些人void在他们的代码中使用运算符.我也在href属性中看到了这一点:javascript:void(0)这似乎没有任何好处javascript:;

那么,使用void运营商的理由是什么?

Cre*_*esh 54

其在链接中的使用说明:

这就是bookmarklet经常将代码包装在void()内部或匿名函数中的原因,该函数不返回任何内容以阻止浏览器尝试显示执行bookmarklet的结果.例如:

javascript:void(window.open("dom_spy.html"))
Run Code Online (Sandbox Code Playgroud)

如果您直接使用返回某些内容的代码(在这种情况下是一个新的窗口实例),浏览器将最终显示:

javascript:window.open("dom_spy.html");
Run Code Online (Sandbox Code Playgroud)

在Firefox中,上面将显示:

[object Window]
Run Code Online (Sandbox Code Playgroud)

  • 这是在语言中包含 `void` 运算符的原始动机,[根据 Javascript 创建者 Brendan Eich 的说法](https://langdev.stackexchange.com/a/2816/89)。 (2认同)

Ben*_*Ben 17

undefined在ES1.3之前,JavaScript中无法直接访问该值.

void <expression>因此包括运营商以允许访问该值.

它有时很有用,特别是在使用Web API(例如事件处理程序)时,以确保表达式的结果始终如一undefined.

undefined属性被添加到ES1.3中的全局对象时,实用程序void变得不明显.

因此你的问题.


小智 14

在 JavaScript 中,void运算符用于显式返回 undefined。它是一元运算符,这意味着只能使用一个操作数。您可以像下面这样使用它?—?独立或带括号。

void expression;
void(expression);
Run Code Online (Sandbox Code Playgroud)

让我们看一些例子

void 0; //returns undefined
void(1); //returns undefined

void 'hello'; //undefined
void {}; //undefined
void []; //undefined

void myFunction(); 
void(myFunction());
Run Code Online (Sandbox Code Playgroud)

如果你问为什么你需要一个特殊的关键字来返回 undefined 而不是仅仅返回undefined:原因是在 ES5 之前你实际上可以命名一个全局变量undefined,像这样:var undefined = "hello"or var undefined = 23,并且大多数浏览器会接受它;undefined没有承诺标识符实际上是未定义的¹。因此,要返回实际的未定义值,使用了void操作符 is/was。虽然它不是一个非常受欢迎的运算符,并且很少使用。

让我们看一个带有 void 的函数示例,

//just a normal function
function test() {
  console.log('hello');
  return 2;
}

//lets call it
console.log(test()); //output is hello followed by 2

//now lets try with void
console.log(void test()); //output is hello followed by undefined
Run Code Online (Sandbox Code Playgroud)

void 丢弃函数的返回值并显式返回 undefined。

您可以从我的教程帖子中阅读更多内容:https : //josephkhan.me/the-javascript-void-operator/

¹ 在 ECMAScript 5 及更高版本中,全局变量undefined保证是未定义的(ECMA-262 第 5 版,第 15.1.1.3 节),尽管内部作用域内的变量仍然可以被命名undefined

  • 这个答案是不正确的。真正的原因是在 ES 3.1 之前,语言中无法直接访问“undefined”。请参阅下面我的回答。 (3认同)

Ala*_*orm 11

考虑以下:

<a href="javascript:void(fish=document.getElementById('foo').value);void(document.getElementById('bar').value=fish);">With Void</a>

<a href="javascript:fish=document.getElementById('foo').value;document.getElementById('bar').value=fish;">Without Void</a>

<input type="text" id="foo" value="one fish" />
<input type="text" id="bar" value="no fish" />
Run Code Online (Sandbox Code Playgroud)

第一个链接将交换文本字段的值.第二个链接将打开一个带有"one fish"文本的新页面.如果你使用a javascript: link,表达式返回nullor之外的其他内容undefined,浏览器会将其解释为链接应该执行的操作.通过将所有表达式/状态包装在void()函数中,可以确保运行整个代码片段.目前,这主要用于Bookmarklets,因为使用onclick属性,或在单独的Javascript块/文件中设置事件处理程序是"常态".

至于javascript:vs. javascript:void(),第一个陈述含糊不清.你说,"嘿,我想运行一些javascript",但是你没有提供任何代码.浏览器应该在这里做什么并不一定清楚.使用第二个语句,你会说"嘿,运行一些javascript",你的代码最终返回undefined,浏览器知道这意味着"什么都不做".

既然我在这里,我也会指出,大多数关心加价的人都使用javascript:或者javascript:void();已经失宠了.更好的办法是让你的onclick处理程序返回false,并将链接指向一个页面/资源,这对于关闭了javascript或使用NoScript等javascript阻止程序的人来说是有意义的.