通常情况下,我只需将它放在if
语句中即可比较一个布尔值,如下所示:
var foo = 'Foo data';
if ( foo ) {
// Do somethings
}
最近,我刚看到一些人在比较之前将变量转换为boolean:
if ( !!foo ) {
// Do somethings
}
在性能或优势方面有什么不同吗?哪个更优选?
答案 0 :(得分:7)
相比之下没有功能上的差异,正如这个小提琴http://jsfiddle.net/aeujgovd/1
所示if(foo){}
if(!!foo){}
使用的唯一理由!!例如,如果你的API期望一个合适的布尔值而不是像0或1这样的标志,那么就是从truthy / falsey值强制一个布尔值。
var myObj = {flag: 0};
function submitObj(myObj){
myObj.flag = !!myObj.flag;
// ... Ajax submit
}
答案 1 :(得分:4)
来自ECMAScript Language Specification的第12.5节:
12.5
if
声明...
生产IfStatement:
if ( Expression )
语句的评估如下:
- 让
exprRef
成为评估表达式的结果。- 如果
ToBoolean(GetValue(exprRef))
为false
,请返回(normal, empty, empty)
。- 返回评估Statement的结果。
醇>
从这里可以看出,ToBoolean()
用于传入的表达式,无论它是否已经是布尔值。
正因为如此,我要说if (foo)
不太可能导致性能下降超过if (!!foo)
,并且由!
引起的两个额外字节无论如何,JavaScript文件中的字符可能会超过将if
语句中的值转换为布尔值的任何奖励。
答案 2 :(得分:0)
如果你可以避免转换......在性能方面总是更好。 如果你想要实现的只是检查foo是否为null,我会选择第一个选项。