我见过有些人在代码中使用
void
运算符。我也在 href
属性中看到了这一点: javascript:void(0)
似乎并不比 javascript:;
更好
那么,使用
void
运算符的理由是什么?
这就是书签的原因 通常将代码包装在 void() 或 一个匿名函数,它不 返回任何内容以停止浏览器 尝试显示结果 执行小书签。为了 示例:
javascript:void(window.open("dom_spy.html"))
如果直接使用返回的代码 某事(一个新的窗口实例 在这种情况下),浏览器将最终 显示:
javascript:window.open("dom_spy.html");
在 Firefox 中,上面将显示:
[object Window]
直到 ES1.3 之前,
undefined
值无法在 JavaScript 中直接访问。
因此包含了运算符
void <expression>
以允许访问该值。
它有时很有用,特别是在使用 Web API(例如事件处理程序)时,可确保表达式的结果一致
undefined
。
当 ES1.3 中将
undefined
属性添加到全局对象时,void
的效用变得不明显。
因此你的问题。
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"
或 var undefined = 23
,大多数浏览器都会接受它;标识符 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/
1 在 ECMAScript 5 及更高版本中,全局变量
undefined
保证未定义(ECMA-262 5th Ed.,§ 15.1.1.3),尽管仍然可以命名内部作用域内的变量undefined
。
考虑以下因素:
<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
,一旦表达式返回 null
或 undefined
以外的内容,浏览器就会将其解释为链接应该执行的操作。通过将所有表达式/语句包装在 void()
函数中,您可以确保整个代码片段都能运行。如今,这主要在 Bookmarklet 中使用,因为使用 onclick
属性,或在单独的 Javascript 块/文件中设置事件处理程序是“规范”。
至于
javascript:
与javascript:void()
,第一个说法是不明确的。你说,“嘿,我想运行一些 javascript”,但你没有提供任何代码。浏览器在这里应该做什么并不一定很清楚。对于第二个语句,您说“嘿,运行一些 javascript”,您的代码最终返回未定义,浏览器知道这意味着“不执行任何操作”。
既然我在这里,我还要指出,使用
javascript:
或 javascript:void();
已经不再受到大多数关心标记的人的青睐。更好的做法是让你的 onclick 处理程序返回 false,并让链接指向对关闭 javascript 或正在使用 JavaScript 拦截器(例如 NoScript)的人有意义的页面/资源。