03. Логические значения
Логический тип данных имеет только два значения, которые представляются литералами true и false.
JavaScript — контекстно-зависимый язык. Например, оператор + означает сложение (или знак числа) в контексте чисел и конкатенацию в контексте строк. В контексте
25+"1" // Равно строке "251"
число 25 автоматически преобразуется в строку, а в контексте
"25"-1 // Равно число 24
строка "25" преобразуется в число 25.
Логические значения в зависимости от контекста также легко преобразуются:
true // равно 1 в контексте числа и "true" в контексте строки
false // равно 0 в контексте числа и "false" в контексте строки
Обратные преобразования:
- число в контексте логического значения преобразуется в true, если оно не 0 и не NaN (последние преобразуются в false);
- строка в контексте логического значения преобразуется в true, если она не пустая, иначе в false;
- специальные значения null и undefined в контексте логического значения преобразуются в false;
- объекты (в том числе функции и массивы), значения которых отличны от null, в контексте логического значения преобразуются в true.
Несколько примеров:
25+true // Равно 26
"25"+true // Равно "25true"
"25"-true // Равно 24
1/false // Равно Infinity
true-false // Равно 1
"false" // Равно true в логическом контексте
[] // Равно true в контексте логического выражения
[1,2] // Равно true в контексте логического выражения
{} // Равно true в контексте логического выражения
{x:1} // Равно true в контексте логического выражения
if ({x:1}) y++; // Переменная y будет увеличена на 1
25 || false // Равно 25, true в контексте логического выражения
25 || "x" // Равно 25, true в контексте логического выражения
"false" || true // Равно "false", true в контексте лог. выражения
"" || 25 // Равно 25, true в контексте логического выражения
0 || "1" // Равно "1", true в контексте логического выражения
0 || "" // Равно "", false в контексте логического выражения
"" && 25 // Равно "", false в контексте логического выражения
25 && 7 // Равно 7, true в контексте логического выражения
25 && "" // Равно "", false в контексте логического выражения
Последняя серия примеров связана с алгоритмами работы операторов || и &&.
Алгоритм вычисления выражения x || y
- Вычисляется первый операнд операции ||. Если его логическое значение есть true, возвращается он сам (то есть, x) и вычисление второго операнда не производится.
- Если логическое значение первого операнда есть false, возвращается второй операнд (то есть, y).
Пример 1
var x = 4;
var y = x-2 || x*x; // у равно 2
Пример 2
var x = 2;
var y = x-2 || x*x; // у равно 4
Алгоритм вычисления выражения x && y
- Вычисляем первый операнд операции &&. Если его логическое значение есть false (false, null, 0, NaN, "", undefined), возвращается он сам (то есть, x) и вычисление второго операнда не производится.
- Если логическое значение первого операнда есть true, возвращается второй операнд (то есть, y).
Пример 1
var x = 2;
var y = x-2 && x*x; // у равно 0
Пример 2
var x = 4;
var y = x-2 && x*x; // у равно 16
Пример 3
Два следующих выражения дают эквивалентные результаты:
(a == b) && f();
if(a == b) f();
Обёртка Boolean не слишком интересна. Класс Boolean содержит только два метода: toString() и valueOf(). Первый преобразует логическое значение в строку, второй — преобразует объект в значение элементарного типа, то есть в true или false.
Можно записать:
true.toString(); // Равно строке "true"
true.valueOf(); // Равно логическому литералу true
Значения null и undefined
Значение null имеет в JavaScript специальный смысл: null есть объект (typeof null == "object") и в то же время это значение говорит об отсутствии объекта.
В числовом контексте null преобразуется в число 0:
25+null // Равно 25
В строковом — в строку "null":
"25"+null // Равно "25null"
В логическом — в false:
!null // Равно true
В JavaScript есть ещё одно интересное значение — undefined. Это значение возвращается при обращении к объявленной переменной, которой не присвоено значение или к свойству объекта, которого не существует.
Пример 1
var x;
alert(x) // undefined
Пример 2
alert(x) // Сообщение об ошибке ("определение x отсутствует")
Пример 3
var x = {}
alert(x.t) // undefined
Видим, что значения null и undefined отличаются, но оператор эквивалентности считает их равными:
null == undefined // Равно true
Конечно, оператор тождественности их различает:
null === undefined // Равно false
В числовом контексте undefined преобразуется в число NaN, в строковом — в строку "undefined", в логическом — в false.
В разделе задания собраны контрольные вопросы (с ответами).