Nesse artigo vamos conhecer e entender como usamos os operadores JavaScript na construção de códigos. Atualmente, existem nove operadores: de atribuição, comparação e igualdade, desigualdade, destructuring, aritméticos, relacionais, lógicos, unários e ternários. Vamos conhecer cada um deles!

Atribuição

Representado pelo símbolo (=), serve para atribuir ao operando do lado esquerdo, um determinado valor definido pelo operando do lado direito. Por exemplo:

let a = "a"
console.log(a)

let numero1 = 1
console.log(numero1)

let arr = []
console.log(arr)

let obj = {}
console.log(obj)

let func = function(){
    return "Funciona também com funções"
}
console.log(func())```jsx
let a = "a"
console.log(a)

let numero1 = 1
console.log(numero1)

let arr = []
console.log(arr)

let obj = {}
console.log(obj)

let func = function(){
    return "Funciona também com funções"
}
console.log(func())

Comparação e Igualdade

Existem dois tipos de comparação: a abstrata, representado pelo símbolo (==) e a estrita, representada pelo símbolo (===).

Muitas vezes, os operadores de comparação e igualdade são confundidos com o operador de atribuição, pois também usam o símbolo de igual (=), mas são bem diferentes.

Comparação abstrata

Essa comparação converte o tipo antes de comparar. Já que o JavaScript não é fortemente tipado, é o valor que será comparado. Vamos aos exemplos:

console.log(1 == '1') //imprime true
console.log(0 == null) //imprime false
console.log(null == undefined) //imprime true

Quando se trata de objetos, o JavaScript vai comparar endereços de memória, que serão os mesmos quando se trata do mesmo objeto. Comparações entre dois objetos diferentes geram resultados falsos:

let objeto1 = {'chave': 'valor'}
let objeto2 = {'chave': 'valor'}
console.log(objeto1 == objeto2) //imprime false pois são duas referências de memória diferentes

Comparação Estrita

Também conhecida como identidade, diferente da abstrata, não faz a conversão de tipo antes da comparação. Ou seja, os operandos só vão retornar true caso sejam estritamente iguais. Por exemplo:

console.log(1 === '1') //imprime false
console.log(null === undefined) //imprime false
console.log(0 === null) //imprime false

A comparação estrita de objetos continua sendo falsa, pelo mesmo motivo da anterior:

let objeto1 = {'chave': 'valor'}
let objeto2 = {'chave': 'valor'}
console.log(objeto1 === objeto2) //imprime false pois são duas referências de memória diferentes

Desigualdade

O operador de desigualdade (!=) retorna true se os operandos não forem iguais. No caso de comparar objetos, continua sendo feita a comparação entre os endereços de memória. Veja o exemplo:

console.log(1 != 2) //imprime true
console.log(1 != '1') //imprime false
console.log(0 != null) //imprime true


let objeto1 = {'chave': 'valor'}
let objeto2 = {'chave': 'valor'}
console.log(objeto1 != objeto2) //imprime true pois de fato são duas referências de memória diferentes

Destructuring

Também chamado de operador de desestruturação, funciona da seguinte forma: ele tira partes de um objeto ou array e “joga” em outra variável. É por isso que quando você tem o objeto obj:

const obj = { nome: 'Maria', sobrenome: 'das Dores', idade:  35}

Que tem as propriedades nome, sobrenome e idade, é possível tirar “partes” desse objeto, que são exatamente essas propriedades!
Por isso que, quando se faz:

const {sobrenome} = obj

Ele retorna o valor da propriedade de mesmo nome, que é “das Dores”.

Ao tentar acessar uma propriedade que não existe, ele retorna undefined:

const obj = { nome: 'Maria', sobrenome: 'das Dores', idade:  35}

const { peso } = obj

console.log(peso)//imprime undefined

Um exemplo usando Arrays seria:

const numeros = [1, 2, 3, 4, 5]
const[a, b, c, d, e] = numeros
console.log(a, b, c, d, e)//imprime 1 2 3 4 5

Operadores Aritméticos

São as operações básicas que já conhecemos: adição (+), subtração (-), divisão (/), multiplicação (*), operações de módulo (%) que retornam o resto da divisão;

let x, y

x = 5
y = 3

console.log(x - y) //imprime 2
console.log(x * y) //imprime 15
console.log(x / y) //imprime 1.66666(...)67
console.log(x % y) //imprime 2

Temos ainda as operações de exponenciação (**), que eleva o primeiro operando ao segundo operando; de incremento (++), que acrescenta ao operando em uma unidade; e de decremento (–) que reduz o operando em uma unidade.

O operador de adição (+) pode tanto fazer a soma dos operandos quanto a concatenação de Strings, então é necessária uma atenção para seu uso.

let x, y

x = 2
y = 3

console.log(x + y) //imprime 5

x = 2
y = "Juntou!"
console.log(x + y) //imprime 2Juntou, a concatenação dos dois operandos

Além disso, o JavaScript considera o valor booleano true == 1, então ao fazer a soma de true com 1, o resultado é 2:

console.log(true + 1) //imprime 2

Apenas mais uma das particularidades do JavaScript! No caso, isso acontece porque ele interpreta 1 e 0 como verdadeiro (true) e falso (false), respectivamente.

Porém, ao tentar fazer uma soma de String e Boolean, o resultado é uma concatenação:

console.log("true" + true) //imprime truetrue

Operadores Relacionais

A depender da relação entre dois operadores, os operadores relacionais retornarão verdadeiro (true) ou falso (false). Essas relações podem ser quatro: de maior (>); maior ou igual (>=); menor (<); e menor ou igual (<=). Por exemplo:

console.log(3 > 2) //imprime true
console.log(3 < 2) //imprime false
console.log(3 >= 2) //imprime true
console.log(3 <= 2) //imprime false

Operadores Lógicos

Os operadores lógicos são: && (“e” lógico), || (“ou” lógico) e o ! (negação lógica).

Também comumente usados com os valores booleanos, exceto os operadores || (“ou” lógico) e && (“e” lógico), que, se usados com valores não-booleanos, podem retornar, também, valores não booleanos.

“E” lógico (&&)

O “e” lógico vai retornar o valor booleano true quando ambas as proposições ambas forem verdadeiras. Se pelo menos uma delas for falsa, o resultado é false.

Por exemplo:

console.log(2 < 3 && 3 > 2) //imprime true
console.log(2 < 3 && 3 < 2) //imprime false
console.log( 2 < 3 && 3 > 2 && 10 <= 100)//usando mais de duas proposições - imprime true

“Ou” lógico ( || )

A principal diferença para o “e” lógico é que, no “ou” lógico, basta uma das proposições estar verdadeira que o resultado impresso é true.

Por exemplo:

console.log(2 < 3 || 3 > 2) //imprime true
console.log(2 < 3 || 3 < 2) // imprime true
console.log( 2 < 3 || 3 > 2 || 10 <= 100)//imprime true

Na lógica matemática temos o ou exclusivo, onde somente uma das proposições é verdadeira; se ambas forem verdadeiras, o resultado é false!

Negação Lógica ( ! )

A negação vai simplesmente inverter o valor booleano da proposição. Ou seja, se a proposição tem o valor true, a negação vai inverter para false, e vice-versa.

O uso de dupla negação (!!) volta a proposição para o seu valor booleano de origem.

Por exemplo:

console.log(2 < 3) //imprime true
console.log(!(2 < 3)) //negação da afirmativa - imprime false
console.log(!!(2 < 3)) //negação da negação, retorna para o valor original - imprime true

Operadores Unários

Os operadores unários podem ter duas formas: prefixada, quando são usados antes do operando; e pós-fixada, quando são usados depois do operando.

 A negação lógica do exemplo anterior é um tipo de operador unário. Além desses, nós temos o incremento (++) e o decremento (–). O (-) pode ser usado também antes de números para inverter o seu valor.

Por exemplo:

num1 = 1
num2 = 2
num3 = 3

num1++ //forma pós-fixada
console.log(num1) //imprime 2 - sofreu incremento de uma unidade

--num2 //forma pré-fixada
console.log(num2) //imprime 1 - sofreu decremento de uma unidade

console.log(-num3) //imprime -3 - o número negativo equivalente

Operadores Ternários

Por fim, os operadores ternários funcionam como simplificações de comparações if/else. Resume a mesma comparação a somente uma linha, tendo a seguinte interpretação:

“A afirmação é verdadeira ? se sim, retorne a primeira opção : se falso, retorne a segunda”.

Por exemplo:

const resultado = nota => nota >= 7 ? 'Aprovado' : 'Reprovado'
//pergunta 'nota é maior ou igual a 7? se sim, retorne "Aprovado" : se não, retorne "Reprovado" ' 

console.log(resultado(7.1)) //imprime Aprovado
console.log(resultado(6.7)) //imprime Reprovado

Esse operador ternário também pode ser entendido da seguinte forma:

function resultado (nota){
    if (nota >= 7) {
        return 'Aprovado'
    } else {
        return 'Reprovado'
    }
}

Só que, convenhamos, o operador ternário é bem mais resumido!

Agora que você já conhece todos os operadores usados na construção de códigos em JavaScript, espero que fique mais claro o seu uso e funcionamento. Para saber mais, recomendo a explicação sobre operadores na página do Mozilla.

Bons estudos!