我绝不是Javascript的专家,但我一直在阅读Mark Pilgrim的"潜入HTML5"网页,他提到了一些我想要更好理解的内容.
他说:
最后,使用双负技巧将结果强制为布尔值(true或false).
function supports_canvas() {
return !!document.createElement('canvas').getContext;
}
Run Code Online (Sandbox Code Playgroud)
如果有人能够更好地解释这一点我会很感激!
我理解double not运算符在JavaScript中的作用.我很好奇它的使用,以及我最近做出的断言是否正确.
我说这if (!!someVar)从来没有意义,也不是(!!someVar && ...因为它if和&&将导致someVar被评估为布尔值所以!! 是多余的.
事实上,我唯一能想到使用double not运算符是合法的,如果你想对另一个布尔值进行严格的比较(那么可能在返回值中明确要求true或false).
它是否正确?我开始怀疑自己的时候,我注意到的jQuery 1.3.2同时使用if (!!someVar)和return !!someVar && ...
双重在这些情况下没有任何实际效果吗?
我个人认为,这只是导致混乱.如果我看到if语句,我知道它将它作为布尔值进行评估.
!!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使用布尔值!!是什么意思?什么是这个代码做这个代码不?
我假设其他程序员不只是使用它,因为它看起来很酷,所以要么这个或我的其他假设是错误的:-)
在别人的代码中,我发现这种方式来测试变量的存在:
if(!!variable) {
//Do something
} else {
//Something else
}
Run Code Online (Sandbox Code Playgroud)
是否有理由进行测试if(!!variable)而不是if(variable)?这是一个好习惯吗?