小编典典

双感叹号?

all

所以我正在调试一些代码并遇到了这个:

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.

  1. 与 相比,使用它有什么好处boolean(foo.bar)吗?

  2. foo.bar 可以在 if 中进行评估,因为0 === false已经如此,那么为什么要进行转换呢?(someVar 不会在其他任何地方重用)


阅读 106

收藏
2022-06-21

共1个答案

小编典典

这会将值转换为布尔值并 确保布尔类型

"foo"      // Evaluates to "foo".
!"foo"     // Evaluates to false.
!!"foo"    // Evaluates to true.

如果foo.bar通过,那么它可能不是 0,而是其他一些虚假值。参见下面的真值表:

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
2022-06-21