【问题标题】:JS - Is there a case where !!x and x don't represent the same logical valueJS - 是否存在 !!x 和 x 不代表相同逻辑值的情况
【发布时间】:2018-07-11 19:36:04
【问题描述】:

我正在重构我的代码,但遇到了几行我在 if 条件中使用双重否定的地方。

这让我开始思考,在 javascript 中是否存在 if (!!x) 无法解析为与 if (x) 相同的条件的情况?

注意:我不是在谈论 !!x !== x,我的意思是它们代表不同的逻辑值。换句话说,是否存在这两个表达式的结果不同的情况。

x ? true : false;
!!x ? true : false;

【问题讨论】:

  • 喜欢x = new Boolean(true)?
  • 技术上如果x = new Boolean(true) 然后!!x !== x。但是,if (x)if (!!x) 都将评估为 true
  • 究竟在问什么?您提出了两个不同的问题,!!x !== xif(x)。那些是一回事。
  • @jhpratt 我编辑了这个问题,我也从未说过!!xx 是平等的。
  • @TheGirrafish 这就是你问题的标题

标签: javascript boolean


【解决方案1】:

x = NaN的情况下,!!x不等于x。这是一个测试:

var x = NaN;
if(!!x == x) {
  console.log("!!x is equal to x");
} else if (!!x !== x) {
  console.log("!!x is not equal to x");
}

但是,它们的逻辑值是相同的,这意味着它们在逻辑测试中的表现相同。因此,无论 x 的性质如何,if(!!x)if(x) 相同,因此if(!!x) 的每个实例都可以安全地替换为if(x)

var x = NaN;
if(!!x) {
  console.log("True");
} else if(x) {
  console.log("False");
}

var x = NaN;
if(x) {
  console.log("True");
} else if(!!x) {
  console.log("False");
}

我做了两个 sn-ps(我在其中交换了测试),这样 if 语句在第一个测试有效时不会停止。

【讨论】:

  • 答案是否定的,不可能有一个变量x,其中!!x的逻辑值与x的逻辑值不同。
【解决方案2】:

没有。

JS 中的每个值要么是假的,要么是真值:

  • 几乎所有对象都是真实的
  • 除 0 外的所有数字都是真实的
  • 所有字符串都期望空字符串为真
  • 0 是假的
  • 空字符串是假的
  • undefined 和 null 是假的

!!expr 会将假值变为假,将真值变为真。它本质上是将 expr 转换为布尔值。

【讨论】:

    【解决方案3】:

    正如已经回答的那样,所有值都是虚假或真实的,因此不存在变量 x,例如 x != !!x。

    但是,如果您的 x 不是变量,而是一个逻辑单元,例如 (a || b),则存在您尚未评估的 x 不等于 !!x 的情况。

    来自MDN Javascript documentation

    o5 = 'Cat' || 'Dog'      // t || t returns "Cat"
    o6 = false || 'Cat'      // f || t returns "Cat"
    

    如果您评估!('Cat' || 'Dog'),则返回值将是false,那么您将得到!!('Cat' || 'Dog'),它当然会返回true

    是的,在这种情况下,您不仅可以获得 x !== !!x ;你也可以得到x != !!x

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-28
      • 2016-05-06
      • 1970-01-01
      • 2019-12-04
      • 1970-01-01
      相关资源
      最近更新 更多