【问题标题】:What is a real-world use-case for JavaScript's void operator?JavaScript 的 void 运算符的实际用例是什么?
【发布时间】:2017-11-05 20:43:16
【问题描述】:

为什么有人会写:

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 - BIG FILE WARNING!

consistent-return.js

【问题讨论】:

  • @Tushar 该示例解释了<script> 标记中的用例,我知道这一点。我对脚本本身的使用更好奇。
  • @JaromandaX 我更新了一个在npm 模块上看到的真实示例。 console.log 是一个糟糕的例子。
  • 是的,看到了——我能看到的唯一原因是将代码减少 1 行!
  • @JaromandaX 我找到了我看到的仓库 void 正在使用,eslint 就是其中之一

标签: javascript void


【解决方案1】:

除了前者写在一行之外,上述两个函数做的事情是一样的。 void 最常用于超链接的内容,浏览器可能会解释返回的结果并尝试显示结果。

在您更新的代码中,void 很重要,因为函数的作者希望在一行中执行以下操作。

  1. 执行 res.send(foo)
  2. 返回无效(无)

因此他/她使用 void 将结果转换为未定义

【讨论】:

    【解决方案2】:

    一个用例是它总是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 community docs 也有相同的内容

    此运算符允许插入产生副作用的表达式 进入计算结果为 undefined 的表达式的位置 想要的。 void 运算符通常仅用于获得未定义的 原始值,通常使用“void(0)”(相当于“void 0")。在这些情况下,可以使用全局变量 undefined 来代替 (假设它没有被分配给一个非默认值)。

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

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

    10,000 次下载可节省约 30,000 字节。

    一致返回与此没有直接关系,它只是确保明确且一致地指定返回值。在整个代码中,使用 void 0 的考虑似乎是文件大小考虑,可能是一些从旧浏览器继承的作者的 旧样式编码,即使 window.undefined 也可以被覆盖。

    【讨论】:

    • 看看我更新的问题,它有很多eslint 使用运算符的例子。也许它会帮助你扩展你的答案?
    • 我可能只考虑文件大小,请参阅更新的答案。
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 2010-10-14
    • 2017-06-26
    • 1970-01-01
    • 2016-10-27
    • 2013-05-14
    • 2012-12-31
    • 2017-02-17
    相关资源
    最近更新 更多