JavaScript 中没有额外的布尔转换

问题描述 投票:0回答:2

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

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

if (foo) {
    // ...
}

但是如果通过 !! 转换为布尔值会怎样?是 return 语句吗?就像这里:

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

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

用简单的英语解释为什么它不同/相同,以及如何在 JavaScript 中规避此规则的示例,这样我的 linter 就不会“看到”它,我们将非常感激。

提前非常感谢。

javascript boolean warnings lint
2个回答
11
投票

好吧,自从问这个问题以来,我自己做了一些研究,实际上偶然发现了一些与 JavaScript 中的双重否定技巧非常相似的问题(带有答案)。 Herehere我找到了一些关于双布尔负数技巧本身的必要性的解释。长话短说,这就像 Java 中的铸造一样。 !!当您实际需要返回布尔值而不更改 true 和 false 时,请使用表达式。它是一个非反转布尔值,或者简单地说,真正的布尔表示。

例如,这个

!true
将是
false
,反之亦然
!false
将是
true
。但是,通过简单地使用
!!true
!!false
,您可以获得相同的
true
false
,而不改变结果,并且仍然可以使用布尔值。
这也可以在数字和字符串上完成:

这些评估为

false
:

  • !!0
  • !!""
    (空字符串)

这些评估为

true
:

  • !!1
  • !!"non-empty-string"

详细了解 JavaScript 中的 TruthyFalsy

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

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


4
投票

我不太清楚你的问题是什么,但关于“no-extra-boolean-cast”的 linter 错误,它告诉你在你的两种情况下

!!
都是不必要的。

您提到的

!!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
© www.soinside.com 2019 - 2024. All rights reserved.