JavaScript 中没有额外的布尔值转换

No extra Boolean cast in JavaScript

在 if 语句中,通过双重否定 (!!) 转换为布尔值是不必要的,因为例如,这些 if 语句是等价的:

if (!!foo) {
    // ...
}

if (foo) {
    // ...
}

但是如果通过 !! 转换为布尔值呢?在 return 语句中?喜欢这里:

nameToSomething : function(someName){
            if (someName) {
                return !!this._var[someVar] ? this._var: undefined;
            }
            return undefined;
        },
return中的

!!this._mServicesByName[someName]和这里的this._mServicesByName[someName]一样吗?为什么?

用简单的英语解释为什么 different/the 相同以及如何在 JavaScript 中规避此规则的示例,因此我的 linter 不会 "see" 非常感谢.

非常感谢。

好的,自问这个问题以来,我自己做了一些研究,实际上偶然发现了一些与 JavaScript 中的双重否定技巧非常相似的问题(有答案)。 Here and here 我找到了一些关于双布尔否定技巧本身的解释。长话短说,这就像在 Java 中进行转换。 !!当您实际需要 return 一个布尔值而不改变 true 和 false 时使用表达式。它是一个非倒置布尔值或简单地说,真正的布尔值表示。

例如 !true 将为 false,反之亦然 !false 将为 true。但是通过简单地使用 !!true!!false 你可以获得相同的 truefalse 而不改变结果并且仍然使用布尔值。 !!0false!!1true 也是如此。

现在,回到我的问题。在上面的代码片段中,我不能省略非反转布尔值,因为作为示例给出的函数需要一个布尔值。并且 false 不能更改为 true,反之亦然。它也不能用按位运算符代替,因为在这种情况下它不起作用。不过,在持有非倒置布尔值的函数上方创建一个新变量有助于使我的 linter 静音。所以这可能是解决问题的答案。

或者,或者,更改 IDE 中 "no-extra-boolean" 规则的 linter 选项将是一个更好的决定)因为在 JavaScript 中,据我所知,它们被使用经常而且没有办法解决它。这甚至不是一个坏习惯。有时,当您需要真正的布尔表示时,这是编写代码的一种非常方便的方法。而且是唯一一个。

我不是很清楚你的问题是什么,但是关于 'no-extra-boolean-cast' 的 linter 错误,它告诉你 !! 在你的两种情况下都是不必要的。

您在 return 中提到 !!this._mServicesByName[someName]this._mServicesByName[someName] 相同,但在您的代码中:return !!this._var[someVar] ? this._var: undefined; 这不是您正在做的。您有一个三元语句,其第一个参数自动转换为布尔值,因此您的 linter 应该正确地抛出错误。

这是不必要的:

`return !!this._var[someVar] ? this._var: undefined;`

而且应该是:

`return this._var[someVar] ? this._var: undefined;`

因为它们是等价的。

然而,这是对布尔类型转换的有效使用:

`return !!this._var[someVar]; // Returns value cast as true/false

因为它完全不一样:

`return this._var[someVar]; // Returns unmodified value