JavaScript 中没有额外的布尔类型转换
Posted
技术标签:
【中文标题】JavaScript 中没有额外的布尔类型转换【英文标题】:No extra Boolean cast in JavaScript 【发布时间】:2015-07-05 23:43:27 【问题描述】:在 if 语句中通过双重否定 (!!) 转换为布尔值是不必要的,因为例如,这些 if 语句是等价的:
if (!!foo)
// ...
if (foo)
// ...
但是如果通过 !! 转换为布尔值呢?是在回报声明?喜欢这里:
nameToSomething : function(someName)
if (someName)
return !!this._var[someVar] ? this._var: undefined;
return undefined;
,
!!this._mServicesByName[someName]
与这里的this._mServicesByName[someName]
相同?为什么?
用简单的英语解释为什么它不同/相同以及如何在 javascript 中规避此规则的示例,因此我的 linter 不会“看到”它,将不胜感激。
非常感谢。
【问题讨论】:
它强制转换为布尔值,返回布尔值与返回对象属性完全不同? 这应该是相当明显的,如果你需要一个布尔值,你可以用一个双逻辑非运算符强制它。如果您只需要一个虚假或真实的值,则无需强制执行任何操作。如果你想变得花哨,你可以按位而不是~~sServiceName
@adeneo 好吧,对于初学者来说并不那么明显:-) 我需要一个布尔值作为返回语句。但我的 linter 认为这是一个错误。那么我可以做这样的事情而不是“return !!this._mServicesByName[someName]”:“var x = !!_mServicesByName”然后“return this.x[somename]”?
@dsg 我的猜测并没有太大的不同,但我不确定。由于问题:-)
你的 linter 并不那么重要,!!func
没有理由无效。
【参考方案1】:
好的,自从提出这个问题后,我自己进行了一些研究,实际上偶然发现了一些与 JavaScript 中的双重否定技巧非常相似的问题(有答案)。 Here 和 here 我发现了一些关于双布尔否定技巧本身需要的解释。长话短说,这就像在 Java 中进行铸造一样。 !!当您实际上需要在不更改真假的情况下返回布尔值时使用表达式。它是一个非反转的布尔值,或者简单地说,真正的布尔表示。
例如,这 !true 将为 false,反之亦然 !false 将为 true。但是通过简单地使用!!true
和!!false
,您可以获得相同的true
和false
,而无需更改结果并且仍然可以使用布尔值。 !!0
是 false
和 !!1
是 true
也是如此。
现在,回到我的问题。在上面的代码 sn-ps 中,我不能省略非反转布尔值,因为作为示例给出的函数需要一个布尔值。并且 false 不能更改为 true,反之亦然。也不能用按位运算符替换,因为在这种情况下它不起作用。但是,在保存非反转布尔值的函数上方创建一个新变量有助于使我的 linter 静音。所以这可能是一个解决问题的答案。
或者,或者,在 IDE 中更改“no-extra-boolean”规则的 linter 选项将是一个更好的决定)因为在 JavaScript 中,据我所知,它们经常被使用并且没有办法绕过它。这甚至不是一个坏习惯。有时,当您需要真正的布尔表示时,这是编写代码的一种非常方便的方法。而且只有一个。
【讨论】:
【参考方案2】:我不完全清楚您的问题是什么,但参考“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
【讨论】:
以上是关于JavaScript 中没有额外的布尔类型转换的主要内容,如果未能解决你的问题,请参考以下文章