Книга: Выразительный JavaScript
Автоматическое преобразование типов
Ранее я упоминал, что 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
. Если вы получили такое значение, поищите, где произошло случайное преобразование типов.
При сравнении величин одного типа через ==
, легко предсказать, что вы должны получить true, если они одинаковые (исключая случай с NaN
). Но когда типы различаются, JavaScript использует сложный и запутанный набор правил для сравнений. Обычно он пытается преобразовать тип одной из величин в тип другой. Когда с одной из сторон оператора возникает null
или undefined
, он выдаёт true
только если обе стороны имеют значение null
или undefined
.
console.log(null == undefined);
// ? true
console.log(null == 0);
// ? false
Последний пример демонстрирует полезный приём. Когда вам надо проверить, имеет ли величина реальное значение вместо null
или undefined
, вы просто сравниваете её с null
при помощи ==
или !=
.
Но что, если вам надо сравнить нечто с точной величиной? Правила преобразования типов в булевские значения говорят, что 0
, NaN
и пустая строка “”
считаются false
, а все остальные – true
. Поэтому 0 == false
и “” == false
. В случаях, когда вам не нужно автоматическое преобразование типов, можно использовать ещё два оператора: ===
и !==
. Первый проверяет, что две величины абсолютно идентичны, второй – наоборот. И тогда сравнение “” === false
возвращает false
.
Рекомендую использовать трёхсимвольные операторы сравнения для защиты от неожиданных преобразований типов, которые могут привести к непредсказуемым последствиям. Если вы уверены, что типы сравниваемых величин будут совпадать, можно спокойно использовать короткие операторы.
- 2.2. Приведение типов
- 3.8. Преобразование типов
- Преобразование XML в реляционную базу данных
- Преобразование строки в целое: stoi( )
- Использование типов содержимого и столбцов
- 5.3 Классификация типов резервного копирования
- 6.2. Создание и автоматическое заполнение бланков стандартных документов
- 2.7 Преобразования типов
- Часть II Автоматическое и ручное восстановление данных с жестких дисков
- Описание типов модулей оперативной памяти
- Объекты без прототипов
- 7. Лекция: Преобразование типов