JavaScript的void运算符有什么实际用途?

6
有人为什么要写这样的代码呢?
function () {
    if (err) {
        return void console.log(err)
    }
}

改为:

function () {
    if (err) {
        console.log(err)
        return
    }
}

有人使用过void操作符吗?我看到它被用在上面的案例中,但很少见。

更新

console.log可能是一个糟糕的例子,因为它本身就返回void。让我展示在一个express应用中我看到的另一种用法:

function (req, res) {
    ...
    // Some error occurred
    if (err) {
        return void res.send(foo)
        // `send` returns a `Response` instance
    }
}

例如,在eslint的源代码中,它被经常使用:

config-initializer.js

jshint.js - 警告:大文件!

consistent-return.js


可能是重复/相关的JavaScript中void运算符的作用是什么? - Tushar
1
@Tushar,那个例子解释了在<script>标签中的用法,我知道。我更好奇的是在脚本本身中的使用。 - borislemke
@JaromandaX 我已经更新了一个我在 npm 模块中看到的真实示例。console.log 是一个糟糕的例子。 - borislemke
是的,看到了 - 我唯一能想到的理由就是将代码减少 1 行! - Jaromanda X
有趣。我以前从未见过,但现在我认为我会在编写不需要返回任何特定值的函数时使用它,但有时它确实会返回值,因为我写了 if (...) return f(...)。这样做比让我的函数的返回值依赖于另一个函数更加简洁,可以使用 if (...) return void f(...) - Steve Bennett
显示剩余2条评论
3个回答

3
一个使用案例是,当 undefined 本身没有执行同样的操作时,window.undefined 总是返回 undefined。在大多数现代浏览器中,window.undefined 不可写,但可以被遮蔽,因为它是一个有效的变量名。嗯,我不会说这是一个真实的情况,但这是一种保险的方式来返回 undefined

function whendefined(){
    var undefined = 'defined';
    return undefined;
}

console.log(whendefined());

function neverdefined(){
    var undefined = 'defined';
    return void 0;
}

console.log(neverdefined());

MDN社区文档也有类似的内容。

该运算符允许将产生副作用的表达式插入到需要求值为undefined的地方。通常,void运算符仅用于获取undefined原始值,通常使用"void(0)"(等同于"void 0")。在这些情况下,可以使用全局变量undefined(假设它尚未被分配给非默认值)。

在es-lint示例中的使用可能只考虑了文件大小,因为这些内容不会以任何方式被缩小。

"undefined".length; //9
"void 0".length;//6

下载10,000次可以节省约30,000字节的空间。

一致的返回与此直接无关,它只是确保明确和一致地指定返回值。在整个代码中,考虑使用void 0似乎是出于文件大小的考虑,可能是作者从旧浏览器中继承下来的一些旧式编码,甚至可以覆盖window.undefined


看一下我的更新问题,其中有很多使用运算符的 eslint 示例。也许它能帮助你扩展你的答案? - borislemke
我可能只考虑文件大小问题,请查看更新的答案。 - sabithpocker

2
以上两个函数做的事情是相同的,只是前一个函数写在一行中。void 在超链接内容中使用最广泛,在这种情况下,浏览器可能会解释返回的结果并尝试显示结果。
在您更新的代码中,void 很重要,因为函数的作者想要在一行中执行以下操作:
1. 执行 res.send(foo) 2. 返回 void(没有任何值)
因此,他/她使用 void 将结果强制转换为未定义。

0

使用案例1

在我的代码中,我总是启用ESLint的no-floating-promises,以确保我永远不会忘记等待一个Promise(回想一下我花费的数小时进行调试,只为发现问题出在这里)。

然而,有时也有一些Promise我想让它们在后台运行而不需要等待它们完成。在这种情况下,void关键字使得ESLint认为Promise已被消耗,但实际上并没有:

fetch('https://google.com/') // ESLint error: no-floating-promises

void fetch('https://google.com/') // Does the same thing; no ESLint error

使用案例2

在其他人的代码中,你经常会看到它与字面量0结合使用:

{ code: "function foo() { if (true) return; else return void 0; }", options: [{ treatUndefinedAsUnspecified: true }] },
--------------------------------------------------------^^^^^^ HERE

这可以有两个原因:

  • 请参见@sabithpocker的答案:因为undefined可以被遮蔽,而void不能。 特别是当代码与任意用户代码混合在一起时,例如在优化器中;在那里,用户可能已经创建了一个名为“undefined”的变量。
  • 因为void 0undefined更短。特别是在编译代码中(例如,如果它已通过terser或webpack传递),重要的是最小化捆绑包中的字符数。void 0有6个字符,而undefined有9个字符,因此对于优化器来说,用void 0替换所有实例的undefined是一个容易的三个字符的胜利。

简而言之:void关键字可以用于以下两种情况:

  • 避免某些代码检查规则
  • undefined替换为void 0以节省三个字符

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接