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,您可以获得相同的truefalse,而无需更改结果并且仍然可以使用布尔值。 !!0false!!1true 也是如此。

现在,回到我的问题。在上面的代码 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 中没有额外的布尔类型转换的主要内容,如果未能解决你的问题,请参考以下文章

javascript双等号引起的类型转换

如何在 JavaScript 中将字符串转换为布尔值?

JS 数据类型转换以其他

前端笔记十四 JavaScript语法详解

JavaScript - 使用JSON.parse()方法将字符串的‘false‘和‘true‘转换成布尔值

JavaScript - 使用JSON.parse()方法将字符串的‘false‘和‘true‘转换成布尔值