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; }, |
作为回报,
一个简单的英语解释为什么它是不同的/相同的,以及如何在javascript中绕过这个规则的例子,所以我的linter不会"看到"它将非常感谢。
非常感谢。
好吧,自从问这个问题之后,我自己做了一些研究,并且发现了一些与JavaScript中的双重否定技巧非常相似的问题(有答案)。在这里和这里,我发现了一些关于双重布尔否定技巧本身的必要性的解释。长话短说,就像在Java中铸造一样。!!!表达式在实际需要返回布尔值而不更改true和false时使用。它是一个非倒置的布尔或简单地说,真正的布尔表示。
例如这个!真是假,反之亦然!错就是真。但是,只要使用
现在,回到我的问题上来。在上面的代码片段中,我不能省略非反转布尔值,因为作为示例给出的函数需要布尔值。错误不能变为真,反之亦然。两者都不能用位运算符替换,因为在这种情况下,它将不起作用。不过,在函数上方创建一个新的变量来保持非反转布尔值有助于使我的linter安静下来。所以这可能是解决问题的答案。
或者,在IDE中更改"没有额外的布尔值"规则的linter选项将是一个更好的决定),因为在javascript中,正如我所了解的,它们经常被使用,而且没有办法绕过它。这甚至不是一个坏习惯。有时,当您需要一个真正的布尔表示时,这是一种非常方便的代码编写方法。唯一的一个。
我不完全清楚你的问题是什么,但是关于"没有额外的布尔值投射"的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 |