maxresdefault

Viagens do Javascript: Zoando com operadores de comparação aritméticos

Fala Pessoal,

Da série “inutulidades pra contar pra rapaziada do serviço”, vou demonstrar uma situação que o Kono trouxe, e acabamos extrapolando de maneira bem comédia, digamos assim.

Bom, primeiro, todos conhecemos operadores de comparação aritméticos (maior, menor, …), ok? Bacana…

O código abaixo começa estranho, já que vou criar 2 objetos, e usar esses operadores para fazer alguma zoeira lógica (e totalmente possível no JS)…


var obj1 = {
 a: 1
};

var obj2 = {
 a: 1
};

Correto?

Agora vamos fazer algumas comparações, em que na maioria das linguagens de cara lançaria uma exceção:

// Sem erros, meio fora de contexto, mas vá lá, o resultado faz algum sentido...
console.log(obj1 > obj2); // false
console.log(obj1 < obj2); // false

// Aqui começa a ficar estranho...
console.log(obj1 >= obj2); // true
console.log(obj1 <= obj2); // true

// Certo, vamos lá:
// 1) Se não é nem menor, nem maior...
// 2) Mas, é maior OU igual, E, menor OU igual...
// 3) Ele só pode ser... verdadeiro, certo? (#sqn)
console.log(obj1 == obj2); // false 

Claro que de cara já é uma comparação tendenciosa, já que objetos com mesmo conteúdo, não são iguais. Mas, como #TheZueiraNeverEnds…

console.log(obj1 != obj2); // true

O que é totalmente lógico do ponto de vista da comparação, mas se levarmos em conta o resultados dos operadores acima… Não faz sentido, mesmo!

Vamos a parte séria do post

Esse artigo pode servir para mostrar que temos que ter cuidado redobrado a atribuições de variáveis e sua atribuição em funções.

Vamos supor que por um capricho do destino (e sabemos que ele é caprichoso) não passemos a variável correta para uma função que espera um numérico:


function fazAlgumaCoisa(variavel) {
    if(variavel >= 10) {
        return true;
    }
    return false;
}

console.log(fazAlgumaCoisa(obj1)); // false

Note que nenhuma exceção foi disparada, e provalvemente só pegariamos isso usando um debugger, as vezes, depois de muita observação…

Uma dica bacana é prefixar as variáveis, ou, usar um padrão de nomenclatura que não deixe dúvidas do que a varável é, por exemplo:


// Padrão que não deixa dúvidas que é um numero...
var totalDeItensDaLista = 10;

// Padrão com prefixo, que nos indica que é um elemento (el) de jQuery ($)
var $elItensDaLista = $(".lista .item");

Categories: Código, Javascript