!!
在那个特定的上下文中,我会说使用显式转换为布尔值或让 if 表达式自然地转换为布尔值之间没有区别。我的意思是,if (x)
将被解释为if (Boolean(x))
,与 相同if (!!x)
。
但是,如果您要从函数返回一个值,例如,如果您想实现一个arrayHasItems
函数,则可以这样实现:
function arrayHasItems(arr) {
return arr.length;
}
在 if 语句中按原样使用函数会起作用,因为从函数返回的数值将被转换为布尔值。但是,客户端代码希望该函数返回一个布尔值,因此他可能会通过以下方式检查条件:
if (arrayHasItems(arr) === true) {}
在这种情况下,它会失败,因为返回的结果arrayHasItems
是一个数字。因此,最好通过返回预期的布尔值来实现该功能。
function arrayHasItems(arr) {
return !!arr.length;
}
编辑:
这带来了一个新问题:为什么 !!arr.length 而不仅仅是 arr.length > 0
两者之间产生的结果没有任何区别,而且您甚至没有节省字节,因为两个语句都采用相同数量的字符。但是我创建了一个测试用例,双重否定似乎表现更好,但它可能在所有浏览器中都不一致。