JavaScript 中没有额外的布尔值转换
No extra Boolean cast in JavaScript
在 if 语句中,通过双重否定 (!!) 转换为布尔值是不必要的,因为例如,这些 if 语句是等价的:
if (!!foo) {
// ...
}
if (foo) {
// ...
}
但是如果通过 !! 转换为布尔值呢?在 return 语句中?喜欢这里:
nameToSomething : function(someName){
if (someName) {
return !!this._var[someVar] ? this._var: undefined;
}
return undefined;
},
return中的!!this._mServicesByName[someName]
和这里的this._mServicesByName[someName]
一样吗?为什么?
用简单的英语解释为什么 different/the 相同以及如何在 JavaScript 中规避此规则的示例,因此我的 linter 不会 "see" 非常感谢.
非常感谢。
好的,自问这个问题以来,我自己做了一些研究,实际上偶然发现了一些与 JavaScript 中的双重否定技巧非常相似的问题(有答案)。 Here and here 我找到了一些关于双布尔否定技巧本身的解释。长话短说,这就像在 Java 中进行转换。 !!当您实际需要 return 一个布尔值而不改变 true 和 false 时使用表达式。它是一个非倒置布尔值或简单地说,真正的布尔值表示。
例如 !true 将为 false,反之亦然 !false 将为 true。但是通过简单地使用 !!true
和 !!false
你可以获得相同的 true
和 false
而不改变结果并且仍然使用布尔值。 !!0
为 false
和 !!1
为 true
也是如此。
现在,回到我的问题。在上面的代码片段中,我不能省略非反转布尔值,因为作为示例给出的函数需要一个布尔值。并且 false 不能更改为 true,反之亦然。它也不能用按位运算符代替,因为在这种情况下它不起作用。不过,在持有非倒置布尔值的函数上方创建一个新变量有助于使我的 linter 静音。所以这可能是解决问题的答案。
或者,或者,更改 IDE 中 "no-extra-boolean" 规则的 linter 选项将是一个更好的决定)因为在 JavaScript 中,据我所知,它们被使用经常而且没有办法解决它。这甚至不是一个坏习惯。有时,当您需要真正的布尔表示时,这是编写代码的一种非常方便的方法。而且是唯一一个。
我不是很清楚你的问题是什么,但是关于 'no-extra-boolean-cast' 的 linter 错误,它告诉你 !!
在你的两种情况下都是不必要的。
您在 return 中提到 !!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
在 if 语句中,通过双重否定 (!!) 转换为布尔值是不必要的,因为例如,这些 if 语句是等价的:
if (!!foo) {
// ...
}
if (foo) {
// ...
}
但是如果通过 !! 转换为布尔值呢?在 return 语句中?喜欢这里:
nameToSomething : function(someName){
if (someName) {
return !!this._var[someVar] ? this._var: undefined;
}
return undefined;
},
return中的!!this._mServicesByName[someName]
和这里的this._mServicesByName[someName]
一样吗?为什么?
用简单的英语解释为什么 different/the 相同以及如何在 JavaScript 中规避此规则的示例,因此我的 linter 不会 "see" 非常感谢.
非常感谢。
好的,自问这个问题以来,我自己做了一些研究,实际上偶然发现了一些与 JavaScript 中的双重否定技巧非常相似的问题(有答案)。 Here and here 我找到了一些关于双布尔否定技巧本身的解释。长话短说,这就像在 Java 中进行转换。 !!当您实际需要 return 一个布尔值而不改变 true 和 false 时使用表达式。它是一个非倒置布尔值或简单地说,真正的布尔值表示。
例如 !true 将为 false,反之亦然 !false 将为 true。但是通过简单地使用 !!true
和 !!false
你可以获得相同的 true
和 false
而不改变结果并且仍然使用布尔值。 !!0
为 false
和 !!1
为 true
也是如此。
现在,回到我的问题。在上面的代码片段中,我不能省略非反转布尔值,因为作为示例给出的函数需要一个布尔值。并且 false 不能更改为 true,反之亦然。它也不能用按位运算符代替,因为在这种情况下它不起作用。不过,在持有非倒置布尔值的函数上方创建一个新变量有助于使我的 linter 静音。所以这可能是解决问题的答案。
或者,或者,更改 IDE 中 "no-extra-boolean" 规则的 linter 选项将是一个更好的决定)因为在 JavaScript 中,据我所知,它们被使用经常而且没有办法解决它。这甚至不是一个坏习惯。有时,当您需要真正的布尔表示时,这是编写代码的一种非常方便的方法。而且是唯一一个。
我不是很清楚你的问题是什么,但是关于 'no-extra-boolean-cast' 的 linter 错误,它告诉你 !!
在你的两种情况下都是不必要的。
您在 return 中提到 !!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