【问题标题】:What does this expression mean "!!"这个表达是什么意思“!!”
【发布时间】:2011-03-04 19:48:12
【问题描述】:

为什么有人会使用这样的表达方式

if(!!window.JSON) alert('exists');

而不仅仅是

if(window.JSON) alert('exists');

?

“!!”还有其他用法吗?东西?

【问题讨论】:

  • 多个否定句虽然可以理解,但这就是原因。如果你在你的代码中继续使用 if(!!(!!)!!!(!)!!obj),那么只有你可以维护它(如果你幸运的话)——我不是笨蛋!
  • 见stackoverflow.com/questions/1406604/…;你是对的,在这种情况下它是多余的,因为if() 已经转换为布尔值

标签: javascript


【解决方案1】:

它是一个布尔转换,确保第一次转换为布尔值,然后否定返回到原始值。

但是它在这里使用不正确,并且只有将它分配给另一个变量时才会真正相关 - 出于性能原因

var isJSON = (!!window.JSON);

if (isJSON) doX;
if (isJSON) doY;
if (isJSON) doZ;

【讨论】:

    【解决方案2】:

    !! 只会导致布尔转换,完全没有必要将此构造与if 语句一起使用,同样在您的第一个 sn-p 中,将 一个对象 转换为布尔没有意义,这将是总是正确的。

    唯一可以强制转换为false 的值是null、undefined、NaN、0 和空字符串,当然还有false,其他任何值都会强制转换为true。

    当您想要确保获得布尔结果时,使用 !! 才有意义,例如在使用逻辑 && 和 || 运算符时。

    这些运算符可以返回操作数的值,而不是布尔结果,例如:

    true && "foo"; // "foo"
    "foo" || "bar" ; // "foo"
    

    假设您有一个测试两个值的函数,并且您期望得到一个布尔结果:

    function isFoo () {
      return 0 && true;
    }
    
    isFoo(); // returns 0, here it makes sense to use !!
    

    编辑:查看您的编辑,if (!!window.JSON) 就像我之前所说的那样是多余的,因为在评估条件表达式时,if statement 本身会进行布尔转换 internally。

    【讨论】:

    • 看起来你打算在最后一个例子中写类似function isFoo(obj){ return obj && true; } isFoo(0); 的东西:) 或return !!obj && true;
    • false && "foo" 计算结果为 false。
    • @Gumbo:是的,是一个错字 s/false/true,@Znarkus,是的,只是为了说明目的;)谢谢大家...
    【解决方案3】:
    // !! = boolean typecasting in javascript
    
    var one = 1
    var two = 2;
    
    if (one==true) app.alert("one==true");
    if (!!one==true) app.alert("!!one==true");
    
    if (two==true) app.alert("two==true"); // won't produce any output
    if (!!two==true) app.alert("!!two==true");
    

    【讨论】:

    • 这就是为什么你应该使用 === 并显式转换:== 类型转换规则有点像 WTF
    【解决方案4】:

    他们可能试图将对象转换为布尔值。通过将布尔运算符 (!) 应用于对象,它变为布尔值,但他们实际上并不想要否定,因此他们应用第二个运算符来取消第一个。

    【讨论】:

      【解决方案5】:

      !是逻辑否定,!!是应用了两次的逻辑否定,即逻辑恒等式

      我会假设您正在阅读的代码只是无害的(尽管令人困惑)冗余。

      【讨论】:

      • 是的,但问题不涉及从对象到布尔值的隐式类型转换吗?
      猜你喜欢
      • 2020-10-23
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 2013-08-02
      • 2022-01-05
      相关资源
      最近更新 更多