Поиск по этому блогу

пятница, 15 июня 2012 г.

Сравнение переменных разных типов в javascript и возможные баги

Решил написать эту статью, т.к. иногда в констукции if () else могут возникнуть ошибки при сравнении переменных разных типов (вернее, не ошибки, а непониание работы интерпретатора). Время на поиск которых может быть несоизмеримым со временем написания данной статьи. Приведу пример сравнения массива и строки:
//Такой пример введет кого угодно в замешательство, но он хорошо отображает суть вопроса
> ",,," == Array(4)
//Вернет true
Если ввести данную команду в консоли вы получите положительный результат (true). Дело в том, что операция сравнения приводит выражения по обе стороны оператора сравнения к единому типу. В данном случае Пустой массив приводится к строковому типу: ",,," - четыре пустых элемента, разделенных запятыми (по умолчанию, элементы массива в javascript разделены запятыми). Для проверки этого можно ввести в консоль следующие примеры:
> Array(4).toString();
//Вернет ",,,"
> ['a','b','c'].toString();
//Вернет "a,b,c"
Во избежание таких ситуаций нужно использовать оператор эквивалентности: "===". В случае сравнения переменной простого типа и объекта к объекту применяется функция ToPrimitive(), которая возвращает значение по умолчанию для объекта это значение возвращаемое методом DefaultValue().

Оператор эквивалентности при работе с объектами javascript

Замечание касательно работы оператора эквивалентности состоит в том, что если проверяются на эквивалентность два объекта, то фактически проверяется эквивалентность их ссылок, поэтому, код: new String("a") !== new String("a") вернет false, т.к. это два разных объекта.

Комментариев нет:

Отправить комментарий