Нажмите "Enter" для перехода к содержанию

10 ошибок в JavaScript, которые совершают почти все

0

Многие вещи, которые казались привычными в Ruby, Python, Java, C или даже PHP, в JS могут отсутствовать или работать иначе.

Многие js-программисты слишком много внимания уделяют точкам с запятой в конце. На самом деле использовать их постоянно совсем не обязательно, а код без лишних символов выглядит чище.

Использование большего количества var при объявлении переменных не замедляет работу программы, зато позволяет не использовать лишние символы в конце строки.

Перенос строки и точка с запятой играют одну и ту же роль в JavaScript. Точка с запятой нужна только для объединения разных частей кода в одной строке (при сжатии, например).

Рассмотрим следующий код:

Переменная stuff находится в глобальной области видимости и не будет относиться к области видимости функции. Из-за повсеместного использования точек с запятой вам необходимо помнить, что нужно заменить точку с запятой на запятую, а точку с запятой добавить в конец строки. Если этого не сделать, ошибки не будет, но stuff, объявленная без var, при компиляции перенесется в самый верх и будет объявлена как глобальная переменная, что может привести к неприятным последствиям.

Правильней было бы опустить точки с запятой, а к объявлению stuff добавить var:

Одна из наиболее распространенных ошибок в JavaScript при работе с асинхронным кодом. Такую ошибку легко допустить, а затрагивает она одинаково программистов клиентской и серверной части.

Рассмотрим типичный код контроллера на Express или Sails.JS:

Размещение return res.json(user) за пределами колбека функции update приведет к тому, что view, которое будет передано AJAX-запросом, увидит только пользователь, не обновлявший страницу.

Перемещение return внутрь колбэка update() поможет устранить проблему:

Похожая ошибка, которая часто встречается на клиентской стороне:

Здесь проблема в том, что $(«.thing-name»).text(thing) будет выполнена перед тем, как data будет получена с сервера. Таким образом, thing останется null.

Другая ошибка, которую часто допускают JavaScript-разработчики при работе с асинхронными запросами случается, когда нужно объединить два ответа из разных мест. Для примера, нам надо сделать два запроса к разным API и объединить ответы. Рассмотрим код:

И thingData, и whatsitData будут возвращаться к вызову return, а функция всегда будет возвращать <>.

Есть соблазн сделать так:

Это сработает. Но второй вызов будет ожидать выполнения первого, что совершенно неэффективно.

Лучше использовать стороннюю библиотеку, например async. async позволяет оформить вызовы таким образом:

Этот код позволяет выполнить запросы синхронно, и в случае ошибок вернуть их описание, а в случае корректного выполнения – получить совмещенный ответ.

Казалось бы, базовые операторы не должны вызывать проблем при использовании, однако невнимательность иногда приводит к глупым ошибкам.

Не имеет значения, что вернет someFunction() – вы всегда будете получать true, ведь в условии описана операция присваивания.

Бывают и обратные ситуации:

В этом случае компилятор выдаст синтаксическую ошибку. Но что, если вы сделаете так:

Здесь строка check_item==items[i] будет просто расценена как false, значение никогда не будет присвоено check_item.

Так же, как и в пункте 3, данные ошибки встречаются слишком часто. Помните, что оператор == сравнивает значения, а === дополнительно сравнивает типы.

Оператор & нужен для сравнения целых чисел, тогда как && сравнивает истинность операндов. Таким образом, 123 & false===0 (потому что false становится 0), но 123 && false===false 9 & 5===1, а 9 && 5===5.

Аналогично случаются ошибки, связанные с использованием операторов | и ||. Применение этих операторов аналогично описанному выше &, за исключением видов сравнения (здесь or вместо and).

Эта ошибка встречается у Ruby-программистов.

В Ruby, если бы x был nil, он бы равнялся 5. А если, к примеру, 9, то он так и остался бы с этим значением.

В JavaScript данный код либо вернет ошибку, либо вернет 13, если x===9.

Это одна из самых актуальных ошибок в JavaScript для Ruby-разработчиков. Ruby-программисты часто считают, что nil в Ruby будет означать то же, что и null в JavaScript. Однако понятия nil в JavaScript нет и невнимательность может привести к ошибке:

Здесь x будет содержать undefined, а не null.

Код выше только вызовет ошибку Uncaught TypeError: undefined is not a function.

Чтобы избежать этого, можно сделать так:

Такой способ сработает, но приведет к утечке памяти: ссылка that не будет объявлена корректно.

Чтобы избежать подобных ошибок, нужно использовать замыкания, которые помогут обрабатывать области видимости должным образом.

В отличие от многих других языков, в JavaScript переменные существуют внутри блока кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *