>// → 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
. Если вы получили такое значение, поищите, где произошло случайное преобразование типов.