« Atribuição de varíavel em uma condição
March 28, 2016 • ☕️ 1 min read
Implementando uma funcionalidade num sistema que ao pressionar determinadas teclas realiza uma validação e que se a tecla UP for pressionada realiza outra validação, resolvi usar atribuição em uma condição para poupar código, acabei descobrindo um bug que explico como resolvi nesse post.
Mapa das teclas:
Número || Tecla9 || TAB13 || ENTER38 || UP KEY40 || DOWN KEY
script.js
var isUPKey = false;function validacao (num) {var keyCode = num;if(keyCode == 13 || keyCode == 40 || (isUPKey = keyCode == 38)) {// código omitido}console.log(isUPKey);}
- Interação #1: validacao(9) // false
- Interação #2: validacao(38) // true
- Interação #3: validacao(40) // true
Por que a variável isUPKey está verdadeira? Sendo que o keyCode é 40? Porque deixei a atribuição e a condição no final.
Na segunda iteração isUPKey era verdadeira, já na #3 iteração a segunda condição atendeu ao esperado logo o interpretador não verifica a última a condição. Pois estamos utilizando o operador || (OU) (se encontra um verdadeiro não verifica o restante). Podemos resolver isso de duas formas:
- Usando o operador && que força todas as condições serem verificadas.
- Mover a condição pro começo.
Nesse cenário a primeira solução não se adequa, pois não consigo verificar mais de uma tecla por vez.
function validacao () {if((isUPKey = keyCode == 38) || keyCode == 13 || keyCode == 40) {// código omitido}console.log(isUPKey);}validacao(40); // false