В то же время все мы знаем, что JavaScript – это также и довольно интересный язык, не лишенный хитростей. Некоторые из них могут быстро превратить повседневную работу программиста в ад, другие же заставят смеяться вслух.
Оригинальная идея проекта WTFJS принадлежит Брайану Леру. Этот список был создан на базе его яркой речи «WTFJS» с dotJS 2012:
Данное руководство можно установить с помощью nmp. Для этого выполните команду:
Теперь вы можете воспользоваться командой wtfjs, которая откроет руководство в выбранном $PAGER. Тем не менее, более развернутый русскоязычный вариант вы найдете только в нашей статье.
Основная цель этого списка – собрать по-настоящему сумасшедшие примеры работы JavaScript и объяснить их принцип, если это возможно. Просто потому, что интересно узнать то, о чем мы раньше не знали.
Если вы новичок, воспользуйтесь данными заметками, чтобы реализовать более глубокое погружение в язык JavaScript. Приведенная информация должна мотивировать вас тратить больше времени на изучение спецификации. Если же вы профессиональный разработчик, рассматривайте это как ссылку на все причуды нашего любимого языка.
В любом случае, просто прочтите, и, вероятно, вы найдете для себя что-то новое.
// -> используется для отображения результата выражения. Например:
//> показывает, каким будет консольный вывод. Например:
// а это просто комментарий, используемый для объяснений. Пример:
[] равняется ![]
Массив равен не массиву:
true – это false
Рассмотрим шаг за шагом:
baNaNa
Язык JavaScript и олдскульная шутка, пусть и преобразованная на новый лад. Вот оригинал:
Выражение воспринимается как «foo» + (+ «bar»), что преобразовывает «bar» в нечисло (Not-a-Number), и, следовательно, вместо «bar» мы получаем значение «NaN».
Но вот сам NaN в JavaScript – это не NaN
Спецификация строго определяет логику данного поведения:
- Если Type (x) отличается от Type (y), возвращается false.
- Если Type (x) является числом, то:
- Если x является NaN, верните false.
- Если y является NaN, верните false.
Также следуя определению NaN из IEEE. Возможны четыре взаимоисключающих типа отношения: меньше, равно, больше и неупорядочено. Последний случай возникает, когда хотя бы один операнд является NaN. Каждое NaN будет сравнивать неупорядоченное со всем, включая себя.
Это фейл
Вы не поверите, но .
Разбив эту массу символов на отдельные части, мы можем заметить, что:
Поэтому мы пытаемся добавить [] к false. Но из-за ряда внутренних вызовов функций (binary + Operator -> ToPrimitive -> [[DefaultValue]]) мы заканчиваем преобразование правильного операнда в строку:
Думая о строке как о массиве, мы можем получить доступ к ее первому символу через [0]:
Остальное очевидно, и только с i дела обстоят непросто. i захватывается в fail, создавая строку «falseundefined» и захватывая элемент по индексу [’10’].
[] – это правдиво, но не true
Массив является правдивым значением, однако он не равняется логическому представлению правды true. Рассмотрим ситуацию подробнее:
В данном случае могу поделиться только ссылками на соответствующие разделы о такой спецификации:
null является ложью, но не false
Язык JavaScript и еще одно явление из разряда «Необъяснимо, но факт». Несмотря на то, что значение null является ложным, оно не равняется логическому представлению неправды false.
В то же время другие неправдивые значения, такие как 0 или ‘’, равны false.
Объяснение такое же, как и в предыдущем примере. Вот ссылка:
Если говорить о JavaScript, как об отдельно существующем языке программирования, в его удобстве и функциональных возможностях нет никаких сомнений. Но, как и у любого языка, здесь есть специфические моменты, для понимания которых следует выкроить время, изучить информацию, рассмотреть примеры и прийти к определенным выводам.
Так или иначе, логика в приведенных «несостыковках» хромает только на первый взгляд, но если открыть документацию и провести параллели с некоторыми другими примерами, становится ясно, что язык JavaScript работает с точностью швейцарских часов.
Надеемся, наша статья оказалась для вас полезной. Напишите в комментариях, о каких еще интересных деталях в работе JavaScript вы знаете.