Распространенные ошибки JavaScript и что они на самом деле означают

Программирование часто сравнивают с магией, но, к сожалению, в языках программирования нет магии. Мы говорим компьютеру, что делать, с помощью детерминированных языков. У каждого результата есть причина, и у каждой ошибки есть логическая причина. Делать ошибки, обнаруживать их и работать с ними — это лишь часть игры.

Я часто вижу, как разработчики сразу же гуглят сообщение об ошибке, сканируя свой код, не пытаясь понять, что означает ошибка. Неправильный подход. Самый быстрый способ решить проблему — предсказать, а затем понять, какую ошибку возвращает интерпретатор. Я собрал несколько вездесущих ошибок JavaScript и разъяснил, что они на самом деле означают.

неопределенный

(Это не ошибка, но мы часто видим это и рассматриваем как ошибку, поэтому полезно знать, что это значит)

В JavaScript есть 6 примитивных типов, и undefined — это значение с собственным типом Undefined. ECMAScript указывает, что:

Примитивное значение Неопределенное значение используется, когда переменной не присвоено значение. Неопределенный тип — это тип, единственным значением которого является значение неопределенное.

В стандарте указано, что вы столкнетесь с неопределенным значением при доступе к неинициализированным/неназначенным переменным и несуществующим свойствам объекта, элементам и т.п., или ссылка на переменную или объект будет сделана вне текущей области выполнения.

Объявление переменной, которой не присвоено какое-либо значение (неинициализированная), принимает неопределенноезначение. Функция без оператора return или с пустым оператором return также возвращает значение undefined. Например:

Существование undefined является результатом разрешающей природы JavaScript.

ReferenceError

Объект ReferenceError наследуется от объекта Error. ReferenceError генерируется при обнаружении недопустимого значения ссылки. Когда вы сталкиваетесь с ReferenceError: 'x' is notdefined, интерпретатор жалуется на несуществующую переменную, на которую есть ссылка в вашем коде, или ссылается на переменную, не входящую в его область действия, или когда JavaScript пытается получить значение неразрешимой ссылки.

Переменная "myArray" нигде не определена, и нам нужно убедиться, что тип данных будет либо строкой, либо массивом.

Еще одна важная концепция заключается в том, что область играет большую роль в обнаружении ReferenceErrors. Область видимости определяет доступность переменных. Переменная должна быть доступна в текущем контексте выполнения, чтобы на нее можно было сослаться. Каждая функция JavaScript создает новую область видимости, поэтому к переменным, определенным внутри функции, нельзя получить доступ извне этой функции, поскольку переменная определяется внутри функции.

Что такое «неразрешимая ссылка»?

Согласно стандартам ECMA, тип Reference состоит из трех компонентов — base value, имя ссылки, и строгий флаг. (Подробнее об этом здесь). Когда создается Reference, его компонентам устанавливаются некоторые значения.

Для основанных на переменных References значением base является объект переменной — объект, связанный с контекстом выполнения, который хранит и объявляет в контексте: переменные и функции. базовое значение — это объект-переменная текущего контекста выполнения, и каждый функциональный контекст имеет свою собственную абстрактную переменную объект. Следовательно, Reference неразрешим, если его базовое значение не определено.

Если Идентификатор — «bat» не может быть найден нигде в цепочке областей видимости, будет возвращена Reference с базой задано значение undefined, что вызывает ReferenceError.

строка 4 должна возвращать ReferenceError, но вместо этого выдает TypeError, так как базовое значение подчиняется CheckObjectCoercible. Он выдает TypeError при попытке преобразовать undefined в Object. Ссылка никогда не будет оцениваться как неразрешимая, если ключевое слово var гарантирует, что переменный объект назначается базовому значению.

Ошибка типа

Ошибка типавозвращается, когда операнд-аргумент передается в функцию и оценивает значение, которое не соответствует ожидаемому типу. Использование неправильного типа данных для определенных операций/методов приведет к TypeError.

Как видно выше, объявление переменной «c» по умолчанию оценивается как undefined , что само по себе является собственным типом данных, который нельзя вызывать как вызов функции. Undefined нельзя преобразовать в функцию путем вызова, поэтому это приведет к ошибке TypeError.

В отличие от C# или Java, JavaScript является свободно типизированным языком, что означает, что переменные могут быть инициализированы без явного указания типа присваиваемого им значения. Работа со свободно типизированным языком, способным преобразовывать типы, делает важным для программистов отслеживать фактический тип значений, с которыми они работают.

Метод .toUpperCase является частью String.prototype, поэтому его нельзя использовать для числа. Вы не можете вызвать строковое значение «num».

Ошибка синтаксиса

Объект SyntaxError указывает на то, что механизм JavaScript обнаружил ошибку (ошибки) при интерпретации и разборе кода. Ошибка возникает, когда код не соответствует синтаксису языка. Этот тип ошибки — одна из самых распространенных ошибок, с которыми мы сталкиваемся, поэтому кодируйте осторожно.

Вывод

Ошибки полезны, когда вы знаете, что они означают. Понимание того, какой тип ошибки интерпретатор завершает, сэкономит вам время при отладке вашего кода. При этом обработка ошибок — это навык, который очень важно знать. Многие программисты не совсем уверены, как наиболее продуктивно обрабатывать ошибки, что приводит к бессистемной обработке ошибок. Хотя есть еще много распространенных ошибок, с которыми мы сталкиваемся ежедневно, мне любопытно узнать, что вы думаете о важности обработки ошибок?

Я поделился некоторыми ресурсами ниже, которые стоит проверить: