所以我正在调试一些代码并遇到了这个:
var foo.bar = 0; // this is actually passed from another function, adding it for context function(foo) { var someVar = !!foo.bar; if (foo.bar) { // ..stuff happens } else { // .. something else happens } }
好的,我的问题是什么意思!!?所做的就是制作0 === false.
!!
0 === false
与 相比,使用它有什么好处boolean(foo.bar)吗?
boolean(foo.bar)
foo.bar 可以在 if 中进行评估,因为0 === false已经如此,那么为什么要进行转换呢?(someVar 不会在其他任何地方重用)
这会将值转换为布尔值并 确保布尔类型 。
"foo" // Evaluates to "foo". !"foo" // Evaluates to false. !!"foo" // Evaluates to true.
如果foo.bar通过,那么它可能不是 0,而是其他一些虚假值。参见下面的真值表:
foo.bar
javascript真值表
'' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true " \t\r\n" == 0 // true
资料来源:道格·克罗克福德
当涉及到 NaN 值时,Javascript 也变得非常奇怪。这是我能想到的唯一情况!会表现得与 === 不同。
NaN === NaN //false !!NaN === !!NaN //true // !!NaN is false