Выразительный JavaScript (Хавербеке) - страница 10

>// → false

>console.log(true && true)

>// → true

Оператор >|| — логическое «или». Выдаёт >true, если одна из величин >true.

>console.log(false || true)

>// → true

>console.log(false || false)

>// → false

«Нет» записывается при помощи восклицательного знака “>!”. Это унарный оператор, который обращает данную величину на обратную. >!true получается >false, >!false получается >true.

При использовании логических и арифметических операторов не всегда ясно, когда нужны скобки. На практике вы можете справиться с этим, зная, что у >|| приоритет ниже всех, потом идёт >&&, потом операторы сравнения, потом все остальные. Такой порядок был выбран для того, чтобы в выражениях типа следующего можно было использовать минимальное количество скобок:

>1 + 1 == 2 && 10 * 10 > 50

Последний логический оператор не унарный и не бинарный – он тройной. Записывается при помощи вопросительного знака и двоеточия:

>console.log(true ? 1 : 2);

>// → 1

>console.log(false ? 1 : 2);

>// → 2

Это условный оператор, у которого величина слева от вопросительного знака выбирает одну из двух величин, разделённых двоеточием. Когда величина слева >true, выбираем первое значение. Когда >false, второе.

Неопределённые значения

Существуют два специальных значения, >null и >undefined, которые используются для обозначения отсутствия осмысленного значения. Сами по себе они никакой информации не несут.

Много операторов, которые не выдают значения, возвращают >undefined просто для того, чтобы что-то вернуть. Разница между >undefined и >null появилась в языке случайно, и обычно не имеет значения.

Автоматическое преобразование типов

Ранее я упоминал, что JavaScript позволяет выполнять любые, подчас очень странные программы. К примеру:

>console.log(8 * null)

>// → 0

>console.log("5" - 1)

>// → 4

>console.log("5" + 1)

>// → 51

>console.log("пять" * 2)

>// → NaN

>console.log(false == 0)

>// → true

Когда оператор применяется «не к тому» типу величин, JavaScript втихую преобразовывает величину к нужному типу, используя набор правил, которые не всегда соответствуют вашим ожиданиям. Это называется приведением типов (coercion). В первом выражении >null превращается в >0, а >“5” становится >5 (из строки – в число). Однако в третьем выражении >+ выполняет конкатенацию (объединение) строк, из-за чего >1 преобразовывается в >“1” (из числа в строку).

Когда что-то неочевидное превращается в число (к примеру, >“пять” или >undefined), возвращается значение >NaN. Последующие арифметические операции с >NaN опять получают >NaN. Если вы получили такое значение, поищите, где произошло случайное преобразование типов.