【问题标题】:If then logic with && ||If then 逻辑与 && ||
【发布时间】:2017-02-28 13:01:05
【问题描述】:

有人可以向我解释或向我指出以下功能为何不起作用的文档吗?

var x = 1;
var y = 2;
var z = 1;

function logicTest() {
  if ((x && y && z) === 1) {
    return true;
  } else {
    return false;
  }
}

console.log(logicTest())

我知道我可以按如下方式把它打出来:

var x = 1;
var y = 2;
var z = 1;

function logicTest() {
  if (x === 1 && y === 1 && z === 1) {
    return true;
  } else {
    return false;
  }
}
console.log(logicTest())

但我真的想了解为什么第一个不起作用,以及是否有更好的方法来键入第二个 if/then 语句,或者这就是它永远必须采用的方式。

谢谢!

【问题讨论】:

  • 任何语言的文档都无法列出所有无效语法的内容。
  • 因为&&|| 与布尔运算符一起使用,在第一种情况下,您尝试对整数值进行操作。在第二种情况下,个别条件解析为布尔值并按原样工作。
  • @DavidThomas 不,JavaScript 中的 && 运算符确实 not 评估为布尔值。结果值取决于 input 值;在这种情况下,该表达式将产生一个数字 (1)。
  • @DavidThomas 是的,我刚刚意识到控制台中的 1 && 2 给了我 2 而不是 true

标签: javascript if-statement logic


【解决方案1】:

表达式

((x && y && z) === 1)

首先涉及(x && y && z)的评估。为了评估这一点,JavaScript 依次测试 xyz 的值。如果从左到右,强制转换为布尔值时其中一个值是false,则评估会以该(非强制)值作为整个事物的值而停止。否则,该子表达式的值将是z 的值,因为它是&& 序列中的最后一个子表达式。

在这种情况下,xyz 都是非零数字,因此整体结果将是 1,因为 z1

您似乎想要做的是测试一组子表达式是否都等于相同的值。正如您所发现的,这只能通过显式比较来确定。这也可以通过创建一个列表然后使用数组函数来执行测试来完成,这在要测试的子表达式不止三个时很有用。

另外,在风格上:

function logicTest() {
  if (x === 1 && y === 1 && z === 1) {
    return true;
  } else {
    return false;
  }
}

使用=== 等关系运算符执行测试会生成布尔值。利用这一点更简洁:

function logicTest() {
  return x === 1 && y === 1 && z === 1;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
相关资源
最近更新 更多