JavaScript

Почему в JS нет низкоуровневых ошибок (предупреждений)?

Почему в Javascript нет низкоуровневых ошибок (Notice/Warning), как в PHP? Например, код 4 * "str"; или другая некорректная математическая операция должен сгенерировать "Notice: A non-numeric value encountered", а потом уже вернуть NaN. Деление на ноль -> "Notice: Division by zero".
Еще примеры:
Обращение к неинициализированной переменной должно сгенерировать вместо исключения уведомление "Notice: x is not defined" и автоматически инициализировать переменную через let или var.

Метод document.querySelector(), если не будет найден DOM элемент по селектору, должен сгенерировать в консоли "Notice: DOM-element 'selector' not found", а потом уже вернуть null.

Попытка прочитать свойство у null или undefined должно выбросить не исключение TypeError, а предупреждение "Warning: Cannot read property of null" и вернуть null или undefined и т. п.

И это далеко не все случаи.
Можно предусмотреть функцию window.triggerError(), а также встроенные константы E_NOTICE, E_WARNING и E_DEPRECATED, а также E_CONSOLE и E_DOCUMENT, указывающие, куда выводить сообщение: только в консоль или в HTML страницы.
Например: window.triggerError("Caught error in code", E_WARNING, E_DOCUMENT);.
Разумеется, лучшей практикой должно быть программирование на JS так, чтобы не было уведомлений и предупреждений.
Потому что JS изначально создавался как очень простой скриптовый язык для веб-страниц. Именно из-за своего первичного назначения, он не предлагает стандартных средств отладки, содержит огромнейшее количество магии, и изо всех сил пытается выполнять то что написал программист (даже если программист написал херню).

Основная сложность этого языка (иосновная причина ненависти к нему) - как раз в том, что он не вытирает сопельки дебилам-программистам. Никакой родительской опеки: что написал, то и получаешь.
То есть, JS фактически заставляет программиста сразу думать головой, и САМОСТОЯТЕЛЬНО писать грамотный код (а не после того, как носом ткнут).

Для тех у кого с "думать головой" проблемки, майкрософт (что символично) запилил надстройку - TypeScript, который и добавляет JS ту самую родительскую опеку: там и явная типизация всего и вся; и паранодиальные интерфейсы для объектов; и "компилятор" tsc в роли строгой мамки, ругающей за глупые ошибки.
Добавляешь к TS'у любой линтер (в современные редакторы он уже встроен) с запретом использования any, и радуешься.
КС
Кайрат Сарманов
58 956
Лучший ответ
Ернур Искаков Такие ошибки/предупреждения нужны в первую очередь для удобства отладки (ошибка может быть случайной, к тому же код будет устойчивее к случайным поломкам). А куча магии не есть хорошо, так как усложняет код. Давно прошли времена, когда JS действительно был простым языком для страниц. Встроенная типизация (необязательная, как в PHP) не будет лишней. У PHP и JS есть два общих свойства: они работают в Интернете, хоть и в разных местах (сервер/клиент), и умеют рендерить HTML контент.
Александр Красноперов С точностью до наоборот: именно бесконтрольность JS учит бездумно присваивать что угодно чему угодно, писать нечитаемые выражения, содержащие пачки побочных эффектов и т. д. по списку типичного говнокода.

Человеку, обучающемуся на JS, даже не придёт в голову, что каждая переменная должна иметь чётко определённый единственный смысл, а не использоваться по всему коду как левая пятка зачесалась.
Потому, что у каждого разработчика языка программирования свой взгляд на то, что должно быть в его языке и чего быть не должно.

В PHP достаточно необычная многоуровневая система ранжирования ошибок. Но она, скорее, не помогает, а провоцирует говнокод: очень часто предупреждения всех видов тупо отключают, оставляя информирование только об ошибках.
Ернур Искаков По идее, языки программирования должны подчиняться каким-то стандартам (IEEE и т. д.). Может быть, система ошибок в JS тоже подчиняется некоему стандарту, а система в PHP - нет.
Ну в теории можно написать универсальную функцию, и добавлять её для проверки всех входных параметров всех функций... какой-нибудь

_tmp_check(args) {
  args.forEach( (e, i) => {
    if( e !== e ) {
      console.log("Notice! argument " + i + " is NaN");
    } else if ( typeof e === 'undefined' ) {      
      console.log("Notice! argument " + i + " is undefined");
    }
}

А в конце работы регуляркой убрать все её вызовы из кода.
Мейрбан Хагшаа
Мейрбан Хагшаа
62 360
Есть подключи отладчик к проекту в IDE windwos monitor
Max Hot
Max Hot
106