splincodewd
@splincodewd
Developer

Как неопределенное поведение в javascript складывается на уровне V8?

60b989b0efc64af8be490b92fe7054e1.jpg
Почитал о странностях JS. Но как это объясняется? Многие с вами в университете писали на С++. И учились определять перегрузку оператора сложения, вычитания и тд., однако неопределенные поведения мы либо обрабатывали исключениями, либо как-то логично обрабатывали входные параметры операндов (obj1 + obj2). А как же тут обрабатывается?

Ведь браузерные движки написаны на С++, а значит все это JS-дело определено на уровне С++, мне интересно какие внутренности определяют такое поведение. Подскажите как мне понять такие вещи?
  • Вопрос задан
  • 325 просмотров
Решения вопроса 2
Nipheris
@Nipheris Куратор тега C++
однако неопределенные поведения мы либо обрабатывали исключениями, либо как-то логично обрабатывали входные параметры операндов (obj1 + obj2). А как же тут обрабатывается?

А вот не поверите, есть два вида программистов: те, которые считают, что хорошо замалчивать ошибки, и те, кто УЖЕ так больше не считает. Есть даже статьи на Хабре, которые рассказывают, какой JS хороший и "надежный". Считать замалчивание ошибок надежностью - имхо это значит не стать (пока что) программистом. От ошибок можно уметь восстанавливаться, но замалчивать их нельзя.
В качестве примера посмотрите на архитектурные подходы в Эрланге. Прям погуглите по словам "erlang let it crash". Этот подход, поддерживаемый концепцией процесса в Эрланге, говорит, что тот код, который не может дальше нормально выполняться, должен "упасть". А мы напишем другой код, который будет следить за работой основного, и в случае нештатных ситуаций будет предпринимать необходимые действия (например, перезапускать процесс).
Да хотя что далеко ходить, концепция исключений в более популярных языках также есть способ научиться жить с ошибками, не бояться их генерировать, и уметь их обрабатывать там, где это возможно и удобно. Это первое.

Второе: JS это язык со слабой типизацией. Это такая штука, которая позволяет написать 1 + "1" и безо всяких перегрузок в стиле C++ транслятор сам приведёт какой-то из аргументов к такому типу, чтобы операцию можно было выполнить. Вы сейчас просто в большом удивлении от того, что это возможно и кому-то такое могло прийти в голову (вы из плюсов пришли, да?). Кстати, в PHP почти то же самое. Только правила преобразований другие немного. (Кстати, почитайте об операторах == и === в JS, узнаете много удивительного, если еще не сталкивались).

Ведь браузерные движки написаны на С++, а значит все это JS-дело определено на уровне С++, мне интересно какие внутренности определяют такое поведение.

Никакие внутренности не определяют это поведение. Все эти случаи либо явно описаны в стандарте JS и их просто реализуют в соответствии со стандартом, либо реализуют так, чтобы реализации были максимально совместимыми. Тут можете почитать про typeof null, возвращающий "object" - по сути один большой баг, который теперь поддерживают, чтобы не сломать совместимость.

Из-за этих мелочей в JS минимум системности и логичности. Этим языком правит совместимость, а не логика. Почему он такой, какой есть, вам уже ответили.
Ответ написан
NaNNaNNaNNaNNaN Batman!
Если серьёзно, то это неявные приведения типов операндов. Вот отличное объяснение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы