2016-10-16 65 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

因此,您需要編寫其他代碼來檢查唯一的數字。