在 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 中的双重否定技巧非常相似的问题(带有答案)。 Here和here我找到了一些关于双布尔负数技巧本身的必要性的解释。长话短说,这就像 Java 中的铸造一样。 !!当您实际需要返回布尔值而不更改 true 和 false 时,请使用表达式。它是一个非反转布尔值,或者简单地说,真正的布尔表示。
例如,这个
!true
将是 false
,反之亦然 !false
将是 true
。但是,通过简单地使用 !!true
和 !!false
,您可以获得相同的 true
和 false
,而不改变结果,并且仍然可以使用布尔值。这些评估为
false
:
!!0
!!""
(空字符串)这些评估为
true
:
!!1
!!"non-empty-string"
详细了解 JavaScript 中的 Truthy 和 Falsy。
现在,回到我的问题。在上面的代码片段中,我不能省略非反转布尔值,因为作为示例给出的函数需要布尔值。 false 不能更改为 true,反之亦然。它也不能用按位运算符替换,因为在这种情况下它不起作用。不过,在保存非反转布尔值的函数上方创建一个新变量有助于使我的 linter 静音。所以这可能是解决问题的答案。
或者,在 IDE 中更改“no-extra-boolean”规则的 linter 选项将是一个更好的决定)因为据我所知,在 JavaScript 中,它们经常被使用,并且没有办法绕过它。这甚至不是一个坏习惯。有时,当您需要真正的布尔表示时,这是编写代码的一种非常方便的方法。而且是唯一的一个。
我不太清楚你的问题是什么,但关于“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