2016-10-16 51 views
0

所以我在做一个谜评估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

长度不为零的字符串是truthy。它不会为1234返回0,因为'1'不等于'2'。 – doug65536

+0

这也应该为1123返回0。 – vijayst

+0

'if(numArr [0] == numArr [1] && numArr.length> = 4)'会和你的代码完全一样。 – doug65536

回答

2

有一件事叫做operator precedence。具有更高优先级的运算符首先发生。 ==发生在&&之前。当你有多个相同优先级的运算符时,它通常是从左到右的“结合性”(例如,=是从右到左)。所以让我们再看看你的代码

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

让我们拿走第一块。做3 == 3是真的,因为没有一个操作符是0,所以if语句是真的。但用1234,1 == 2是错误的,所以表达式会短路到假。通常当某事(如if语句)接受布尔值& &非零/ undefined/false值时,该表达式被认为是真实的(我可能是错误的)。如果你做下面你应该得到真的

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

为了回答您的其他问题,通常当人们用JS一组数据,他们使用lodash工作。您可以轻松找到是否有两个唯一值。 uniq(array,func)以相同的顺序返回一个具有唯一值的数组。​​

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

这是因为 字符串3333 NUM [0]是3,NUM [1] = 3,NUM [2] = 3,NUM [3] = 3个

表达式的计算基于运营商 的优先级,并在运营商有他们从左至右

在这种情况下执行==拥有& & 最高优先级相同的优先级左右, NUM [0] == NUM​​ [1],它是3 == 3真实 然后 真& & NUM [2] & & NUM [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 ]

对于& &操作,如果第一个操作数是假的,它忽略了表达 其余所以现在它只是导致假

希望这有助于

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] 

任何非Falsy(false0,"",null, undefinedNaN)是Truthy

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