双感叹号?

jpa*_*o84 180 javascript

可能重复:
什么是!! (不是)JavaScript中的运算符?
什么!! 运算符(双惊叹号)在JavaScript中意味着什么?

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

好的,我的问题是什么意思!!?所有这一切都在做0 === false.

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

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

Gaz*_*ler 291

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

"foo"      // Evaluates to "foo".
!"foo"     // Evaluates to false.
!!"foo"    // Evaluates to true.
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

资料来源:Doug Crockford

当谈到NaN值时,Javascript也变得非常奇怪.这是我能想到的最好的情况!会对===表现不同.

NaN   ===  NaN     //false
!!NaN === !!NaN    //true

// !!NaN is false
Run Code Online (Sandbox Code Playgroud)

  • 这实际上并没有回答这个问题.问题是:"foo.bar可以在if中进行评估,因为0 ===已经错了,所以为什么要进行转换呢?" 你的答案解释*它确保了布尔类型,但OP已经知道了; 问题是,确保布尔类型的要点是什么? (11认同)

rua*_*akh 13

我认为答案是没有太多意义.我们可以推测它是如何产生的:

  • 也许是someVar在多个地方使用的功能的早期版本,或者是真正受益于truefalse更好的方式,因此这更有意义.
  • 也许编写该函数的人习惯于使用!!转换为true/ false他甚至没有注意到这里没有必要.
  • 也许编写函数的人感觉每个计算(在这种情况下,布尔转换)都应该通过为其结果赋予一些变量来赋予有意义的名称.
  • 也许,因为JavaScript中的布尔转换出乎意料地容易出错(例如,这new Boolean(false)是一个真值值),编写函数的人觉得它应该总是明确地而不是隐式地完成 - 即使效果是相同的 -只是把注意力作为一个潜在的错误点.
    • 当然,这预先假定编写函数的人认为!!是"显式"布尔转换.从技术上讲,它不是 - 它使用相同的隐式布尔转换if- 但如果你习惯了这个习惯用法,那么它就等于显式转换.

但在我的主观意见中,这些原因都不是一个非常好的原因!

  • 这是特别相关的,让我更喜欢这个答案;“(例如 new Boolean(false) 是一个真值),” (2认同)

Mat*_*ock 5

如上所述,它强制使用布尔类型的对象.你可以自己看看:

(function typecheck() {
  var a = "a";
  var b = !a;
  var c = !!a;

  alert("var a = " + typeof(a) + "\n" +
        "var b = " + typeof(b) + "\n" +
        "var c = " + typeof(c));
})();
Run Code Online (Sandbox Code Playgroud)

如果您只是进行比较,转换只会在以后为您节省类型强制.

仅供参考,以下值在JavaScript中被强制为FALSE:

  • 0
  • ""
  • 空值
  • 未定义