通常,我会通过将布尔值放入if
语句中来比较它,如下所示:
var foo = 'Foo data';
if ( foo ) {
// Do somethings
}
最近,我看到一些人在比较之前将变量转换为布尔类型:
if ( !!foo ) {
// Do somethings
}
这两个方案在性能或优势上有什么不同?哪一个更可取?
通常,我会通过将布尔值放入if
语句中来比较它,如下所示:
var foo = 'Foo data';
if ( foo ) {
// Do somethings
}
最近,我看到一些人在比较之前将变量转换为布尔类型:
if ( !!foo ) {
// Do somethings
}
这两个方案在性能或优势上有什么不同?哪一个更可取?
如此示例中的fiddle所示,比较中没有任何功能上的差异 http://jsfiddle.net/aeujgovd/1
if(foo){}
if(!!foo){}
var myObj = {flag: 0};
function submitObj(myObj){
myObj.flag = !!myObj.flag;
// ... Ajax submit
}
来自ECMAScript语言规范第12.5节:
12.5
if
语句...
IfStatement: if (Expression) Statement
的产生式的求值过程如下:
- 令
exprRef
成为评估Expression的结果。- 如果
ToBoolean(GetValue(exprRef))
为false
,则返回(normal, empty, empty)
。- 返回评估Statement的结果。
从这里我们可以看到,无论传入的表达式是否已经是布尔值,ToBoolean()
都会在其上使用。
if (foo)
不太可能比 if (!!foo)
造成更大的性能损失,并且在 JavaScript 文件中由两个 !
字符引起的两个额外字节可能会抵消将值转换为布尔值的任何奖励。无论如何,在 if
语句中进行转换的效果。如果可以避免转换...从性能角度来看,总是更好的选择。 如果你只想检查foo是否为空,我会选择第一种选项。