JavaScript автоматически определяет тип данных. Иногда это приводит к непредвиденным последствиям:
Сложение числа с булевым значением: |
1+true; //2 |
При сложении строки с числом, JavaScript отдает предпочтение строке:
Сложение числа со строкой: |
“2”+3; // 23 |
Для сравнения значений на равенство либо не равенство между собой используются операторы == (двойное равно) или === (тройное равно).
Оператор == сравнивает два значения без учета типов значений. Оператор === сравнивает два значения с учетом типов каждого значения. Если два аргумента относятся к одному типу, между ними нет никакой разницы. Тем не менее, стоит избегать использования оператора со смешанными типами (==). Сравнение двойным равно может привести к неожиданным результатам. Например, код из следующего листинга вернет true:
Сравнение аргументов двойным равно, которое вернет true: |
“1.0e0” == { valueOf: function(){return true;} } |
Чтобы поведение программы было понятнее при сравнении значений разных типов необходимо использовать явное приведение типов данных и использовать оператор ===.
Переменная, значением которой окажется null, не вызывает сбоя при арифметическом вычислении, она будет преобразована в 0.
Неопределенная переменная преобразуется в специальное значение с плавающей точкой NaN. Причем, NaN рассматривается как неравное самому себе.
Проверка значения на равенство NaN не работает: |
var x = NaN x === NaN; //false |
Протестировать переменную на значение NaN можно путем проверки ее на неравенство самой себе:
Тестирование переменной на значение NaN: |
var x = NaN x !== x; // true |
Можно создать специальную функцию:
Функция тестирования переменной на значение NaN: |
function isNaN(x){ return x !== x; } |
Еще одна разновидность приведения типов данных называется истинностью. Операторы if, ||, && работают с булевыми значениями, но на самом деле принимают любые. Большинство значений JavaScript являются истинными, т.е. неявным образом приводятся к true. Существует лишь 7 ложных значений:
false, 0, -0, “”, NaN и undefined
Все остальные значения истинны.