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

No extra Boolean cast in JavaScript

在if语句通过双重否定(!!)是不必要的,因为例如,这些if语句是等效的:

1
2
3
4
5
6
7
if (!!foo) {
    // ...
}

if (foo) {
    // ...
}

但是如果通过投射到布尔值呢!!在RETURN语句中吗?像这里:

1
2
3
4
5
6
nameToSomething : function(someName){
            if (someName) {
                return !!this._var[someVar] ? this._var: undefined;
            }
            return undefined;
        },

作为回报,!!this._mServicesByName[someName]与这里的this._mServicesByName[someName]相同吗?为什么?

一个简单的英语解释为什么它是不同的/相同的,以及如何在javascript中绕过这个规则的例子,所以我的linter不会"看到"它将非常感谢。

非常感谢。


好吧,自从问这个问题之后,我自己做了一些研究,并且发现了一些与JavaScript中的双重否定技巧非常相似的问题(有答案)。在这里和这里,我发现了一些关于双重布尔否定技巧本身的必要性的解释。长话短说,就像在Java中铸造一样。!!!表达式在实际需要返回布尔值而不更改true和false时使用。它是一个非倒置的布尔或简单地说,真正的布尔表示。

例如这个!真是假,反之亦然!错就是真。但是,只要使用!!true!!false,就可以得到相同的truefalse,而不改变结果,仍然使用布尔值。对于!!0false!!1true的情况也是如此。

现在,回到我的问题上来。在上面的代码片段中,我不能省略非反转布尔值,因为作为示例给出的函数需要布尔值。错误不能变为真,反之亦然。两者都不能用位运算符替换,因为在这种情况下,它将不起作用。不过,在函数上方创建一个新的变量来保持非反转布尔值有助于使我的linter安静下来。所以这可能是解决问题的答案。

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


我不完全清楚你的问题是什么,但是关于"没有额外的布尔值投射"的linter错误,我告诉你,在这两种情况下,!!都是不必要的。

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

这是不必要的:

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

应该是:

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

因为它们是等价的。

但是,这是对布尔值强制转换的有效使用:

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

因为它根本不等同于:

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