为何使用!! 将变量强制转换为布尔值以用于条件表达式?

dav*_*wil 12 javascript

!!x将变量的类型强制x转换为布尔值,同时保持其真实性或缺乏真实性 - 请参阅此问题 - 我对条件表达式中使用此问题有疑问.

在JS代码中,我曾经看过几次曾经!!在一个if类似的条件下将变量强制转换为布尔类型

if(!!x) {
    x.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

其中的想法是x在调用方法之前测试if是否已定义.

但是,在我自己的代码中,我总是使用它

if(x) {
    x.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

x定义if的前提下,条件将通过,如果x未定义,则不会通过.

所以我的问题是在这种情况下强制x使用布尔值!!什么意思什么是这个代码这个代码不?

我假设其他程序员不只是使用它,因为它看起来很酷,所以要么这个或我的其他假设是错误的:-)

pla*_*alx 11

在那个特定的上下文中,我会说明确地转换为布尔值使用!!或者让if表达式自然地转换为布尔值没有区别.我的意思是if (x)将被解释为if (Boolean(x)),与之相同if (!!x).

但是,如果要从函数返回值,例如,如果要实现arrayHasItems函数,则可以通过以下方式实现:

function arrayHasItems(arr) {
    return arr.length;
}
Run Code Online (Sandbox Code Playgroud)

在if语句中使用函数将起作用,因为从函数返回的数值将转换为布尔值.但是,客户端代码期望函数返回一个布尔值,因此他可能通过执行以下操作来检查条件:

if (arrayHasItems(arr) === true) {}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它会失败,因为返回的结果arrayHasItems是一个数字.因此,通过返回类似于expect的布尔值来实现该函数会更好.

function arrayHasItems(arr) {
    return !!arr.length;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

这提出了一个新问题:为什么!! arr.length而不仅仅是arr.length> 0

在产生的结果和你甚至没有保存字节之间没有任何区别,因为两个语句都使用相同数量的字符.但是我创建了一个测试用例,双重否定似乎表现得更好,但它可能在所有浏览器中都不一致.