Логические операторы ECMAScript

Логические операторы очень важны, они позволяют языку программирования работать корректно.

Логические операторы имеют три типа: НЕ, И и ИЛИ.

Операция ToBoolean

Прежде чем изучать различные логические операторы, давайте сначала рассмотрим операцию ToBoolean, описанную в спецификации ECMAScript-262 v5.

Абстрактная операция ToBoolean преобразует свои параметры в логические значения в соответствии с правилами, указанными в таблице:

Тип параметра Результат
Неопределено false
Null false
Булево Результат равен введенному параметру (без преобразования)
Число Если параметр равен +0, -0 или NaN, то результат равен false; в противном случае true.
Строка Если параметр является пустой строкой, то результат равен false; в противном случае true.
Объект true

Оператор логического НЕ

В ECMAScript логический оператор NOT аналогичен логическому оператору NOT в C и Java, и也表示感叹ительным знаком (!).

В отличие от логических операторов OR и AND,Логический оператор NOT всегда возвращает Boolean-значение.

Редукция логического оператора NOT behaves as follows:

  • Если аргумент является объектом, возвращает false
  • Если аргумент является числом 0, возвращает true
  • Если аргумент является любым числом, кроме нуля, возвращает false
  • Если аргумент является null, возвращает true
  • Если аргумент является NaN, возвращает true
  • Если аргумент является undefined, возникает ошибка

Обычно, этот оператор используется для управления циклами:

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

В этом примере переменная Boolean (bFound) используется для записи успешности поиска. При нахождении данных в проблеме bFound устанавливается в true, !bFound равно false, что означает, что выполнение跳出 while-цикл.

При определении Boolean-значения ECMAScript-переменной можно также использовать логический оператор NOT. Для этого нужно использовать два оператора NOT в одной строке кода. Важно то, что любой аргумент, передаваемый в первый оператор NOT, всегда возвращает Boolean-значение. Второй NOT инвертирует это Boolean-значение, тем самым давая истинное Boolean-значение переменной.

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));

Результат:

Логическое значение bFalse равно false
Логическое значение sRed равно true
Логическое значение iZero равно false
Логическое значение iThreeFourFive равно true
Логическое значение oObject равно true 

Логический оператор AND

В ECMAScript логический оператор AND представлен двойным и (&&):

Например:

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

Следующая истинная таблица описывает поведение логического оператора AND:

Операнд 1 Операнд 2 Результат
true true true
true false false
false true false
false false false

Операнды логического оператора AND могут быть любого типа, не только Boolean значениями.

Если один из операндов не является исходным Boolean значением, логический оператор AND не всегда возвращает Boolean значение:

  • Если один из операндов является объектом, а другой является Boolean значением, возвращается объект.
  • Если оба операнда являются объектами, возвращается второй объект.
  • Если один из операндов является null, возвращается null.
  • Если один из операндов является NaN, возвращается NaN.
  • Если один из операндов является undefined, происходит ошибка.

Как и в Java, логический оператор AND в ECMAScript также является простым оператором, то есть если первый операнд определяет результат, второй операнд больше не вычисляется. Для логического оператора AND, если первый операнд false, то результат не может быть true, независимо от значения второго операнда.

Рассмотрим следующий пример:

var bTrue = true;
var bResult = (bTrue && bUnknown);	//произойдет ошибка
alert(bResult);			//эта строка не будет выполнена

Этот фрагмент кода вызовет ошибку при выполнении логического оператора AND, так как переменная bUnknown неопределена. Значение переменной bTrue равно true, так как логический оператор AND продолжит вычисление переменной bUnknown. Это приведет к ошибке, так как значение bUnknown неопределено и не может быть использовано в логическом операторе AND.

Если изменить этот пример, установив первый аргумент в false, ошибка не произойдет:

var bFalse = false;
var bResult = (bFalse && bUnknown);
alert(bResult);			//вывод "false"

В этом фрагменте кода скрипт выведет значение логического оператора AND, то есть строку "false". Даже если значение переменной bUnknown неопределено, оно не будет вычислено, так как значение первого операнда равно false.

Совет:При использовании логического оператора AND необходимо помнить о его свойстве простого вычисления.

Логический оператор OR

Логический оператор OR в ECMAScript аналогичен оператору OR в Java и также обозначается двойной вертикальной чертой (||):

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

Ниже приведена истинная таблица, описывающая поведение логического оператора OR:

Операнд 1 Операнд 2 Результат
true true true
true false true
false true true
false false false

Как и логический оператор AND, если один из операндов не является значением Boolean, логический OR не всегда возвращает значение Boolean:

  • Если один из операндов является объектом и все операнды слева от объекта равны false, то возвращается этот объект.
  • Если оба операнда являются объектами, возвращается первый объект.
  • Если последний операнд является null и все другие операнды равны false, то возвращается null.
  • Если последний операнд является NaN и все другие операнды равны false, то возвращается NaN.
  • Если один из операндов является undefined, происходит ошибка.

Как и логический оператор AND, логический OR также является простым вычислением. Для логического оператора OR, если первый операнд равен true, второй операнд больше не вычисляется.

Например:

var bTrue = true;
var bResult = (bTrue || bUnknown);
alert(bResult);			//Выводится "true"

Как и в предыдущем примере, переменная bUnknown не определена. Однако, поскольку значение переменной bTrue равно true, bUnknown не будет вычислена, поэтому выводится "true".

Если изменить bTrue на false, произойдёт ошибка:

var bFalse = false;
var bResult = (bFalse || bUnknown);	//Произошла ошибка
alert(bResult);			//Эта строка не будет выполнена