我看到一些代码似乎使用了一个我无法识别的运算符,以两个感叹号的形式出现,如下所示:!!.有人可以告诉我这个运营商的作用吗?
我看到这个的背景是,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
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使用布尔值!!是什么意思?什么是这个代码做这个代码不?
我假设其他程序员不只是使用它,因为它看起来很酷,所以要么这个或我的其他假设是错误的:-)
我最近阅读了一些代码,用于!!将变量转换为boolean以便在if语句中进行求值.这对我来说似乎有些多余,因为无论如何都要对变量进行布尔值的评估.这样做有什么性能优势,还是为了更好的浏览器支持?
示例代码:
var x = 0;
var atTop = x===window.scrollY;
if(!!atTop){
alert("At the top of the page.");
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我也看过这个不是布尔类型的操作数,但是我总是假设使用它if会评估变量的布尔值,因为Javascript中的所有值都是"truthy"或"falsey".
示例代码:
var x = 1;//or any other value including null, undefined, some string, etc
if(!!x){//x is "truthy"
//wouldn't using if(x) be the same???
console.log("something...");
}
Run Code Online (Sandbox Code Playgroud) 在Javascript中,几乎所有表达式(所有表达式?)都具有"真实性"值.如果将表达式放在需要布尔值的语句中,它将计算为布尔等价物.例如:
let a = 'foo'
if (a) {
console.log('a is truthy!');
}
// Will print 'a is truthy!'.
Run Code Online (Sandbox Code Playgroud)
在某些工作场所,通常通过两次否定它来将这种情况下的表达式强制转换为实际的布尔值:
let a = 'foo'
if (!!a) {
console.log('a is truthy!');
}
// Will print 'a is truthy!'.
Run Code Online (Sandbox Code Playgroud)
我的问题:这只是风格问题吗?它纯粹是为了与读取我们真正认识到a的不是布尔值的代码的人沟通,但我们打算如此评估它?还是存在任何表达式或值a,其中if (a)实际的计算结果比不同的布尔值if (!!a)?
在别人的代码中,我发现这种方式来测试变量的存在:
if(!!variable) {
//Do something
} else {
//Something else
}
Run Code Online (Sandbox Code Playgroud)
是否有理由进行测试if(!!variable)而不是if(variable)?这是一个好习惯吗?
在一个if condidition中,何时使用双重否定是有意义的?我发现了这种模式几次:
JS
if(!!children.length) { ...}
Run Code Online (Sandbox Code Playgroud)