Why use double exclamation marks in an if statement?
我最近读了一些代码,它使用
样例代码:
1 2 3 4 5 | var x = 0; var atTop = x===window.scrollY; if(!!atTop){ alert("At the top of the page."); } |
编辑:
我也看到过对于不属于布尔类型的操作数的这种情况,但我一直假设使用
样例代码:
1 2 3 4 5 | 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..."); } |
简短回答:不,没有理由。
在您的代码中,它已经是一个
1 2 3 4 | console.log(!!true); // Will be always"true" console.log(typeof !!true); // It stills a"boolean" type console.log(!!false); // Will be always"false" console.log(typeof !!false); // It stills a"boolean" type |
编辑过的问题的答案:是的,是一样的。这就是
这里有一个小测试,你可以在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | const initialArr = [ undefined, null, true, false, 0, 3, -1, +Infinity, -Infinity, Infinity, 'any', '', function() { return 1 }, {}, { prop: 1 }, [], [0], [0, 1] ]; function testIsTheSame(arr) { equolityCounter = 0; arr.forEach(item => { let ifStatement = false; let doubleNotStatement = !!item; if(item) { ifStatement = true; } if(ifStatement === doubleNotStatement && typeof ifStatement === typeof doubleNotStatement) { equolityCounter++; } }); console.log(`Is the same: ${equolityCounter === arr.length}`); } testIsTheSame(initialArr); |
我会说这主要是为了代码的可读性。我怀疑是否存在任何重要的性能或兼容性影响(请有人自由测试)
但是在代码可读性方面,这意味着以前这个变量不是一个布尔值,但是我们希望将它作为一个变量来计算,如果您添加了有关这个变量的新逻辑,请记住这一点。
虽然在你的例子中,它已经是布尔型的,所以它是100%冗余的,但我想这只是一个习惯,有人对上面的推理过度应用,和/或看到它在其他地方和复制模式,而没有完全理解它(短篇小说时间:在c中,你可以通过添加
这完全取决于
总之,如果EDOCX1的值(13)与EDOCX1的值(0)有任何不同,则第一个负数将其转换为布尔值(负数)。第二个否定将布尔值返回到原始
例如,如果
但是,在代码中,
在if语句中这样做没有任何运行时好处(或目标好处)。if语句执行的计算将产生与双感叹号生成的计算完全相同的结果。没有区别。
双感叹号是确保基于真实性的布尔值的有用表达式。例如,考虑:
1 2 3 4 5 6 7 8 9 10 | var text = undefined; console.log(text); // undefined console.log(!!text); // false // It would make sense here, because a boolean value is expected. var isTextDefined = !!text; // It would also affect serialization JSON.stringify(text); // undefined (non-string) JSON.stringify(!!text); //"false" |
我认为这是由于上述用例而养成的一种习惯,因此在希望解决变量的真实性时,总是转换为布尔值。当规则总是被应用时,我们(人类和程序员)更容易遵循它。你可以一直使用车内的闪光灯,即使周围没有人,也可以偶尔(或经常)忘记发出信号。