【问题标题】:What is the point of void operator in JavaScript?JavaScript 中的 void 运算符有什么意义?
【发布时间】:2010-10-14 14:16:21
【问题描述】:

我见过一些人在他们的代码中使用void 运算符。我也在href 属性中看到了这一点:javascript:void(0) 这似乎并不比javascript:; 更好

那么,使用void 运算符的理由是什么?

【问题讨论】:

  • void 是一个在计算给定表达式后不返回任何内容的运算符,您不需要使用“(”和“)”来使其工作。
  • sizeof 在 C 中是相同的——但如果使用括号,代码会更清晰。
  • void 很少使用。在 ES5 中,它被认为是过时的。在评估其操作数后,它返回undefined

标签: javascript void


【解决方案1】:

JavaScript,void 运算符用于显式返回未定义。它是一元运算符,这意味着它只能使用一个操作数。您可以如下所示使用它 — 独立或带括号。

void expression;
void(expression);

让我们看一些例子

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

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

void myFunction(); 
void(myFunction());

如果你问为什么你需要一个特殊的关键字来返回 undefined 而不是仅仅返回 undefined:原因是在 ES5 之前你实际上可以命名一个全局变量 undefined,就像这样:var undefined = "hello" 或 @ 987654329@,大多数浏览器都会接受;标识符undefined 并未被承诺实际上是未定义的¹。所以要返回 actual 未定义的值,void 运算符被使用。虽然它不是一个非常流行的运算符,但很少使用。

让我们看一个带有 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

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

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

¹ 在 ECMAScript 5 及更高版本中,全局变量 undefined 保证未定义(ECMA-262 5th Ed.,第 15.1.1.3 节),但仍然可以将内部范围内的变量命名为 undefined .

【讨论】:

  • 这个答案不正确。实际原因是 undefined 在 ES 3.1 之前无法直接在该语言中访问。请参阅下面的答案。
  • @BenAston:ES 3.1 或 1.3,就像你的回答一样?
  • 1.3.我的错。
【解决方案2】:

Explanation of its use in links:

这就是小书签的原因 通常将代码包装在 void() 或 一个匿名函数 返回任何内容以停止浏览器 从试图显示结果 执行小书签。为了 示例:

javascript:void(window.open("dom_spy.html"))

如果你直接使用返回的代码 一些东西(一个新的窗口实例 这种情况下),浏览器将结束 显示:

javascript:window.open("dom_spy.html");

在 Firefox 中将显示以上内容:

[object Window]

【讨论】:

  • Internet Explorer(我测试过 IE 11)与 Firefox 的行为一致,但 Chrome 不适用于 JS 代码 javascript:window.open("dom_spy.html");。它会打开一个新选项卡,而不会对当前选项卡窗口产生任何副作用。
【解决方案3】:

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

因此包含一个运算符 void <expression> 以允许访问此值。

它有时很有用,尤其是在使用 Web API(例如事件处理程序)时,可确保表达式的结果始终为 undefined

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

因此你的问题。

【讨论】:

    【解决方案4】:

    考虑以下几点:

    <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" />
    

    第一个链接将交换文本字段的值。第二个链接将打开一个带有文本“一条鱼”的新页面。如果您使用javascript: link,则在表达式返回除nullundefined 之外的内容的那一刻,浏览器就会将其解释为链接应该执行的操作。通过将所有表达式/语句包装在 void() 函数中,您可以确保您的整个 sn-p 代码将运行。如今,这主要在 Bookmarklets 中使用,因为使用 onclick 属性,或者在单独的 Javascript 块/文件中设置事件处理程序是“规范”。

    至于javascript:javascript:void(),第一个说法是模棱两可的。你说,“嘿,我想运行一些 javascript”,但是你没有提供任何代码。不一定清楚浏览器应该在这里做什么。在第二个语句中,您说“嘿,运行一些 javascript”,而您的代码最终返回 undefined,浏览器知道这意味着“什么都不做”。

    既然我在这里,我还要指出,使用javascript:javascript:void(); 已经不受大多数​​关心标记的人的青睐。更好的做法是让您的 onclick 处理程序返回 false,并让链接指向一个页面/资源,该页面/资源对关闭 javascript 或使用 javascript 拦截器(如 NoScript)的人有意义。

    【讨论】:

    • 问题作者写的是“javascript:;”,而不是“javascript:”。那么,在那种情况下就不会模棱两可了,不是吗?
    • 空语句是返回false,还是返回true,说明语句运行成功?
    • 为什么空语句会返回一些东西?
    • 语法无效:(...;...)。要么使用逗号运算符,要么将void 0void(0) 放在末尾。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2011-06-30
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2021-11-01
    相关资源
    最近更新 更多