为什么这组逻辑运算符正常工作?

时间:2016-10-16 04:36:36

标签: javascript logical-operators

所以我正在做一个谜题来评估Kaprekar的例程,在第一部分我需要检查以确保4位数输入至少有两个唯一的数字所以我这样做了:

let numArr = num.toString().split("");

if (numArr[0] == numArr[1] && numArr[2] && numArr[3]) {
  return 0;
}

我试过搜索,但我一直在寻找短路运营商的链接。我期待将numArr [0] ==写入每个&&但令我惊讶的是它有效。谁能解释为什么这会为3333返回0而不是1234?我假设numArr [2]和numArr [3]会自动评估为true。

3 个答案:

答案 0 :(得分:2)

有一个名为operator precedence的东西。优先级较高的运算符首先发生。 ==发生在&&之前。如果您有多个具有相同优先级的运算符,则它会通过“关联性”(通常从左到右)(=,例如从右到左);那么让我们再看看你的代码

if ( ((numArr[0] == numArr[1]) && numArr[2]) && numArr[3] )

我们来看看第一件作品吧。执行3 == 3是真的,因为没有运算符为0,所以if语句为真。但是对于1234,1 == 2是假的,因此表达式短路为假。通常当某些东西(比如if语句)接受一个布尔值&&一个非零/未定义/假值,该表达式被认为是真的(我可能是错的)。如果你这样做,你应该成真

if ( numArr[0] && numArr[1] && numArr[2] && numArr[3] )

要回答您的其他问题,通常当人们使用JS中的一组数据时,他们会使用lodash。您可以通过线路轻松找到是否有2个唯一值。 uniq(array,func)以相同的顺序返回具有唯一值的数组。 See the documentation

_.uniq("3333".toString().split(""), v=>v).length >= 2 //false
_.uniq("1224".toString().split(""), v=>v).length >= 2 //true

答案 1 :(得分:0)

这是因为 对于String 3333 num [0]为3,num [1] = 3,num [2] = 3,num [3] = 3

表达式根据运算符的优先级进行评估 当运算符具有相同的优先级时,它们从左到右执行

在这种情况下,==的优先级高于&& 所以, num [0] == num [1],它是3 == 3真 然后 真实&& num [2]&& num [3] =>真&& 3&& 3 =>真

对于字符串1234 NUM [0] = 1,NUM [1] = 2,NUM [2] = 3,NUM [3] = 4 num [0] == num [1],1 == 2为假 所以现在的表达是 虚假&& num [2]&& num [3]

对于&&运算符如果第一个操作数为false,则忽略表达式的其余部分 所以现在它只是假的结果

希望这有帮助

答案 2 :(得分:0)

您正在评估三个表达式

// loose-equality, so true if after type-coersion, the values are equivalent
// this is the only condition that is actually changing in your code, unless
// you have a number with less than 4 digits
numArr[0] == numArr[1] 

// is a non-empty string so it's 'truthy'
numArr[2] 

// is a non-empty string so it's 'truthy'
numArr[3] 

任何非麻痹的行为(false0""nullundefinedNaN)都是{{3 }}

因此,您需要编写其他代码来检查唯一数字。