Подтвердить что ты не робот

Есть ли у JavaScript поведение undefined?

Существует ли у JavaScript поведение undefined (похожее на C) или оно полностью определено спецификацией и детерминированным?

Обратите внимание, что я отказываюсь от ошибок реализации и расхождений в спецификациях. Я также отбрасываю такие вещи, как Math.random() и Date.now().

Есть ли фрагмент кода JavaScript, для которого поведение не полностью определено спецификациями JavaScript и, таким образом, имеет "undefined поведение"?

4b9b3361

Ответ 1

В спецификации много вещей, которые явно оставлены для реализации. Особенно, когда дело доходит до Host Objects, может быть много причуд. Примеры, которые не имеют ничего общего с объектами хоста:

15.1 Глобальный объект

Значения внутренних свойств [[Prototype]] и [[Class]] глобального объекта зависят от реализации.

15.1.2.2 parseInt (string, radix)

[Если слишком много значимых цифр] mathInt может быть зависимой от реализации приближением к математическому целочисленному значению, которое представлено Z в нотации radix-R.

15.3.4.2 Function.prototype.toString

Возвращается представление функции , зависящее от реализации.

Почти все алгоритмы синтаксического анализа даты и строчки зависят от реализации, включая toLocaleString, toString, parse и конструктор Date.

15.4.4.11 Array.prototype.sort(comparefn) - скорее всего, лучший пример:

Если comparefn не является undefined и не является последовательной функцией сравнения для элементов этого массива, поведение сортировки реализовано.

[...] Если proto не является нулевым и существует целое число j, так что выполняются все нижеприведенные условия, то поведение сортировки определяется реализацией:

  • obj разрежен (15.4)
  • 0 ≤ j < Len

Поведение сортировки также реализовано, если obj разрежено, и выполняется любое из следующих условий:

  • Внутреннее свойство [[Extensible]] объекта obj неверно.
  • Любое свойство индекса массива obj, чье имя является неотрицательным целым числом меньше len, является свойством data, атрибут [[Configurable]] является ложным.

Поведение сортировки также реализовано, если любое свойство индекса массива obj, чье имя является неотрицательным целым числом меньше len, является свойством accessor или является свойством data, атрибут [[Writable]] false.

И наиболее надежно:

Выполните последовательность вызовов , зависящих от реализации [...]

15.5.4.9 String.prototype.localeCompare(that)

Две строки сравниваются с реализацией

15.5.4.11 String.prototype.replace[В символах замены, если число больше числа групп], результат определяется реализацией.

Я просто остановлю перечисление здесь, вы можете выполнить поиск по спецификации. Другими заметными местами могут быть методы toLocaleString или зависимые от реализации приближения, возвращаемые методами Math.

Ответ 2

Я нашел несколько примеров, цитируя спецификации языка ECMAScript (выделение мое):

8.5 Тип номера

В некоторых реализациях внешний код может обнаруживать разницу между различными значениями Not-a-Number, но такое поведение зависит от реализации; к коду ECMAScript все значения NaN неотличимы друг от друга.

15.7.4.5 Number.prototype.toFixed(fractionDigits)

Если метод toFixed вызывается с несколькими аргументами, то поведение undefined (см. раздел 15).

15.7.4.6 Number.prototype.toExponential(fractionDigits)

Если метод toExponential вызывается с несколькими аргументами, поведение undefined (см. раздел 15).

15.7.4.7 Number.prototype.toPrecision(точность)

Если метод toPrecision вызывается с несколькими аргументами, то поведение undefined (см. раздел 15).

15.9.4.3 Date.UTC(год, месяц [, дата [, часы [, минуты [, секунды [, мс]]]]])

Когда функция UTC вызывается с менее чем двумя аргументами, поведение зависит от реализации.

Ответ 3

Я нашел

Array.sort(compareFunction);

в случае, когда compareFunction не ведет себя должным образом (т.е. возвращает согласованные результаты для одних и тех же входов).

Из спецификации:

Если comparefn не undefined и не является последовательной функцией сравнения для элементов этого массива (см. ниже), поведение сортировки определяется реализацией.

Ответ 4

Любая программа, которая вызывает C-style Undefined Behavior в ответ на любой ввод, будет непригодна для использования с ненадежным вводом. Хотя существует множество ситуаций, когда спецификация ECMAScript не указывает точное поведение, но она не дает реализациям одинаковой свободы отрицать законы времени и причинности, которые имеют компиляторы C с Undefined Behavior.