所以我正在做一个谜题来评估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。
答案 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]
任何非麻痹的行为(false
,0
,""
,null
,undefined
和NaN
)都是{{3 }}
因此,您需要编写其他代码来检查唯一数字。