Operadores booleanos do ECMAScript

Os operadores booleanos são muito importantes, pois permitem que a linguagem de programação funcione corretamente.

Os operadores booleanos têm três tipos: NOT, AND e OR.

Operação ToBoolean

Antes de aprendermos sobre vários operadores lógicos, vamos entender a operação ToBoolean descrita na especificação ECMAScript-262 v5.

A operação abstrata ToBoolean converte seus parâmetros conforme as regras da tabela a seguir:

Tipo de parâmetro Resultado
Indefinido false
Nulo false
Booleano O resultado é igual ao parâmetro de entrada (sem conversão)
Número Se o parâmetro for +0, -0 ou NaN, o resultado é false; caso contrário, é true.
String Se o parâmetro for uma string vazia, o resultado é false; caso contrário, é true.
Objeto true

Operador lógico NOT

No ECMAScript, o operador NOT lógico é o mesmo que o operador NOT lógico em C e Java, representado pelo sinal de exclamação (!).

Diferente dos operadores lógicos OR e AND,O operador NOT lógico sempre retorna um valor Booleano.

O comportamento do operador NOT lógico é o seguinte:

  • Se o operando for um objeto, retornará false
  • Se o operando for o número 0, retornará true
  • Se o operando for qualquer número além de 0, retornará false
  • Se o operando for null, retornará true
  • Se o operando for NaN, retornará true
  • Se o operando for undefined, ocorrerá um erro

Normalmente, esse operador é usado para controlar loops:

var bFound = false;
var i = 0;
while (!bFound) {
  if (aValue[i] == vSearchValues) {
    bFound = true;
  } else {
    i++;
  }
}

Neste exemplo, a variável Booleana (bFound) é usada para registrar se a busca foi bem-sucedida. Quando o item de dados no problema for encontrado, bFound será configurado como true, !bFound será igual a false, o que significa que o loop while será encerrado.

Quando avaliar o valor Boolean de uma variável ECMAScript, também pode-se usar o operador lógico NOT. Isso requer o uso de dois operadores NOT em uma linha de código. Independentemente do tipo do operando, o primeiro operador NOT retorna um valor Booleano. O segundo NOT negará esse valor Booleano, fornecendo o valor Booleano real da variável.

var bFalse = false;
var sRed = "red";
var iZero = 0;
var iThreeFourFive = 345;
var oObject = new Object;
document.write("bFalse 的逻辑值是 " + (!!bFalse));
document.write("sRed 的逻辑值是 " + (!!sRed));
document.write("iZero 的逻辑值是 " + (!!iZero));
document.write("iThreeFourFive 的逻辑值是 " + (!!iThreeFourFive));
document.write("oObject 的逻辑值是 " + (!!oObject));

Resultado:

O valor lógico do bFalse é false
O valor lógico do sRed é true
O valor lógico do iZero é false
O valor lógico do iThreeFourFive é true
O valor lógico do oObject é true 

Operador lógico AND

No ECMAScript, o operador lógico AND é representado por dois e (&&):

Por exemplo:

var bTrue = true;
var bFalse = false;
var bResult = bTrue && bFalse;

A tabela de verdade a seguir descreve o comportamento do operador lógico AND:

Operando 1 Operando 2 Resultado
true true true
true false false
false true false
false false false

Os operandos da operação lógica AND podem ser de qualquer tipo, não apenas valores Booleanos.

Se algum operando não for um valor Booleano original, a operação lógica AND não retorna necessariamente um valor Booleano:

  • Se um operando for um objeto e o outro for um valor Booleano, retorna o objeto.
  • Se ambos os operandos forem objetos, retorna o segundo objeto.
  • Se algum operando for null, retorna null.
  • Se algum operando for NaN, retorna NaN.
  • Se algum dos operandos for undefined, ocorre erro.

Semelhante à operação lógica AND em Java, a operação lógica AND em ECMAScript é uma operação simples, ou seja, se o primeiro operando determinar o resultado, o segundo operando não será calculado. Para a operação lógica AND, se o primeiro operando for false, independentemente do valor do segundo operando, o resultado nunca pode ser true.

Considere o seguinte exemplo:

var bTrue = true;
var bResult = (bTrue && bUnknown); // Ocorre erro
alert(bResult); // Esta linha não será executada

Este código provocará um erro ao realizar a operação lógica AND, pois a variável bUnknown é undefined. O valor da variável bTrue é true, pois a operação lógica AND continuará a calcular a variável bUnknown. Isso provocará um erro, pois o valor de bUnknown é undefined e não pode ser usado na operação lógica AND.

Se modificar este exemplo, definindo o primeiro número como false, não ocorrerá erro:

var bFalse = false;
var bResult = (bFalse && bUnknown);
alert(bResult); // Exibe "false"

Neste código, o script exibe o valor retornado pela operação lógica AND, ou seja, a string "false". Mesmo se o valor da variável bUnknown for undefined, ela não será calculada, pois o valor do primeiro operando é false.

Dica:Ao usar o operador lógico AND, lembre-se de que ele tem essa característica de cálculo simplificado.

Operador lógico OR

O operador lógico OR no ECMAScript é o mesmo que no Java, representado por duas barras verticais (||):

var bTrue = true;
var bFalse = false;
var bResult = bTrue || bFalse;

A tabela de verdade a seguir descreve o comportamento do operador lógico OR:

Operando 1 Operando 2 Resultado
true true true
true false true
false true true
false false false

Como o operador lógico AND, se algum dos operandos não for um valor Booleano, a operação lógica OR não retorna necessariamente um valor Booleano:

  • Se um dos operandos for um objeto e todos os valores à esquerda do objeto forem false, retorna o objeto.
  • Se ambos os operandos forem objetos, retorna o primeiro objeto.
  • Se o último operando for null e todos os outros operandos forem false, retorna null.
  • Se o último operando for NaN e todos os outros operandos forem false, retorna NaN.
  • Se algum dos operandos for undefined, ocorre erro.

Como o operador lógico AND, a operação lógica OR também é uma operação simplificada. Para o operador lógico OR, se o primeiro valor de operação for true, o segundo valor de operação não será calculado.

Por exemplo:

var bTrue = true;
var bResult = (bTrue || bUnknown);
alert(bResult);			// Saída "true"

Como no exemplo anterior, a variável bUnknown é não definida. No entanto, devido ao valor true da variável bTrue, bUnknown não será calculado, portanto, a saída é "true".

Se você mudar bTrue para false, ocorrerá erro:

var bFalse = false;
var bResult = (bFalse || bUnknown);	// Ocorre erro
alert(bResult);			// Esta linha não será executada