Спецификация ECMAScript 5.1 с аннотациями

Поделиться

15.7 Объекты Number #

15.7.1 Вызов конструктора Number как функции #

При вызове Number не в качестве конструктора, а в качестве функции производится преобразование типов.

15.7.1.1 Number ( [ value ] ) #

Возвращает значение типа Number (а не объект Number), вычисляемое абстрактной операцией ToNumber(value), если value передавалось; в противном случае возвращает +0.

15.7.2 Конструктор Number #

Если Number вызывается как часть выражения new, он является конструктором, так как он инициализирует создаваемый объект.

15.7.2.1 new Number ( [ value ] ) #

Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным исходному объекту-прототипу Number, который представляет собой начальное значение свойства Number.prototype (15.7.3.1).

Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "Number".

Внутреннее свойство [[PrimitiveValue]] создаваемого объекта устанавливается равным ToNumber(value), если аргумент value передавался; в противном случае оно устанавливается равным +0.

Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

15.7.3 Свойства конструктора Number #

Значением внутреннего свойства [[Prototype]] конструктора Number является объект-прототип Function (15.3.4).

Кроме внутренних свойств и свойства length со значением 1, конструктор Number имеет следующее свойство:

15.7.3.1 Number.prototype #

Начальным значением Number.prototype является объект-прототип Number (15.7.4).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.7.3.2 Number.MAX_VALUE #

Значением Number.MAX_VALUE является наибольшее положительное конечное значение типа Number, равное приблизительно 1.7976931348623157 × 10308.

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.7.3.3 Number.MIN_VALUE #

Значением Number.MIN_VALUE является наименьшее положительное значение типа Number, равное приблизительно 5 × 10324.

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.7.3.4 Number.NaN #

Значением Number.NaN является NaN.

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.7.3.5 Number.NEGATIVE_INFINITY #

Значением Number.NEGATIVE_INFINITY является −∞.

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.7.3.6 Number.POSITIVE_INFINITY #

Значением Number.POSITIVE_INFINITY является +.

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.7.4 Свойства объекта-прототипа Number #

Объект-прототип Number сам по себе является объектом типа Number (его [[Class]] равен "Number"), значение которого равно +0.

Значением внутреннего свойства [[Prototype]] объекта-прототипа Number является стандартный встроенный объект-прототип Object (15.2.4).

Если только явно не указано иначе, описанные ниже методы объекта-прототипа Number не являются родовыми методами. Передаваемое им значение this либо должно быть значением типа Number, либо должно быть объектом Object, внутреннее свойство [[Class]] которого равно "Number".

В приведённых ниже описаниях функций, представляющих собой свойства объекта-прототипа Number, фраза "текущий объект Number" означает либо объект, который представляет собой значение this для данного вызова функции, либо, если тип Type(значение this) равен Number – объект, как если бы он был создан выражением new Number(значение this ), где Number является стандартным встроенным конструктором с этим именем. Кроме того, фраза “текущее числовое значение” означает либо числовое значение, представленное текущим объектом типа Number (то есть, значение внутреннего свойства [[PrimitiveValue]] для объекта this типа Number), либо значение this, если его тип равен Number. Если значение this не является ни объектом, у которого внутреннее свойство [[Class]] равно "Number", ни значением, тип которого равен Number, генерируется исключение TypeError.

15.7.4.1 Number.prototype.constructor #

Начальным значением Number.prototype.constructor является встроенный конструктор Number.

15.7.4.2 Number.prototype.toString ( [ radix ] ) #

Необязательный аргумент radix должен быть целочисленным значением в пределах от 2 до 36 включительно. Если radix отсутствует или равен undefined, в качестве значения radix принимается 10. Если ToInteger(radix) равно числу 10, то текущее числовое значение передаётся в абстрактную операцию ToString качестве аргумента, и возвращается полученная строка.

Если ToInteger(radix) не равен целому числу от 2 до 36 включительно, генерируется исключение RangeError. Если ToInteger(radix) равен целому числу от 2 до 36, но не 10, результатом является строковое представление текущего числового значения с использованием указанного основания системы счисления. Для обозначения чисел, имеющих значение от 10 до 35, используются буквы от a до z. Если основание системы счисления не равно 10, точный алгоритм представления чисел зависит от реализации, однако в целом он должен основываться на алгоритме, указанном в пункте 9.8.1.

Функция toString не является родовой функцией. Если её значение this не является Number или объектом Number, она генерирует исключение TypeError. Поэтому она не может передаваться другим типам объектов для использования в качестве метода.

15.7.4.3 Number.prototype.toLocaleString() #

Результатом является строковое значение, представляющее собой текущее числовое значение в формате, соответствующем требованиям текущей языковой настройки внешней среды. Данная функция зависит от реализации; разрешается (хотя и не поощряется), чтобы она возвращала такой же результат, что и toString.

ПРИМЕЧАНИЕ Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

15.7.4.4 Number.prototype.valueOf ( ) #

Возвращает текущее числовое значение.

Функция valueOf не является родовой функцией. Если её значение this не является числовым значением или объектом Number, она генерирует исключение TypeError. Поэтому она не может передаваться другим типам объектов для использования в качестве метода.

15.7.4.5 Number.prototype.toFixed (fractionDigits) #

Возвращает строку, содержащую текущее числовое значение в десятичном представлении с фиксированной запятой, с цифрами после десятичной запятой в количество fractionDigits. Если fractionDigits равно undefined, принимаем значение 0. А именно, выполняются следующие шаги:

  1. Пусть f будет ToInteger(fractionDigits). (Если fractionDigits равно undefined, то значение, полученное на этом шаге, равно 0).

  2. Если f < 0 или f > 20, сгенерировать исключение RangeError.

  3. Пусть x будет равно числовому значению this.

  4. Если x равно NaN, вернуть строку "NaN".

  5. Пусть s будет пустой строкой.

  6. Если x < 0, то

    1. Пусть s будет "-".

    2. Пусть x = –x.

  7. Если x 1021, то

    1. Пусть m = ToString(x).

  8. Иначе, x < 1021

    1. Пусть n будет целым числом, для которого точное математическое значение n ÷ 10fx будет как можно ближе к нулю. Если таких n два, выбрать большее из них.

    2. Если n = 0, пусть m будет строкой "0". В противном случае, пусть m будет строкой, состоящей из цифр десятичного представления n (по порядку, без начальных нулей).

    3. Если f 0, то

      1. Пусть k будет количеством символов в m.

      2. Если kf, то

        1. Пусть z будет строкой, состоящей из f+1–k экземпляров символа ‘0’.

        2. Пусть m будет результатом конкатенации строк z и m.

        3. Пусть k = f + 1.

      3. Пусть a будет первыми символами строки m в количестве kf , а b – оставшимися символами строки m в количестве f.

      4. Пусть m будет результатом конкатенации трёх строк: a, "." и b.

  9. Вернуть результат конкатенации строк s и m.

Свойство length для метода toFixed равно 1.

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

Реализации разрешается распространять поведение метода toFixed на значения fractionDigits, меньших 0 или больших 20. В этом случае метод toFixed не обязательно будет генерировать для таких значений исключение RangeError.

ПРИМЕЧАНИЕ Результат вычисления метода toFixed может быть на несколько цифр точнее, чем результат вычисления метода toString, поскольку toString выводит только то количество значащих цифр, которое достаточно для того, чтобы отличить это число от соседних. Например,

(1000000000000000128).toString() возвращает "1000000000000000100",
а (1000000000000000128).toFixed(0) возвращает "1000000000000000128".

15.7.4.6 Number.prototype.toExponential (fractionDigits) #

Возвращает строку, содержащую текущее числовое значение в экспоненциальном представлении, с одной цифрой перед десятичной запятой значащей части, и с цифрами в количестве fractionDigits после десятичной запятой значащей части. Если fractionDigits равно undefined, то включают столько значащих цифр, сколько необходимо для уникального описания числа (как в ToString, с той лишь разницей, что в этом случае это число всегда выводится в экспоненциальной записи). А именно, выполняются следующие шаги:

  1. Пусть x будет равно текущему числовому значению.

  2. Пусть f будет ToInteger(fractionDigits).

  3. Если x равно NaN, вернуть строку "NaN".

  4. Пусть s будет пустой строкой.

  5. Если x < 0, то

    1. Пусть s будет "-".

    2. Пусть x = –x.

  6. Если x = +, то

    1. Вернуть результат конкатенации строк s и "Infinity".

  7. Если fractionDigits не равно undefined, и (f < 0 or f > 20), сгенерировать исключение RangeError.

  8. Если x = 0, то

    1. Пусть f = 0.

    2. Пусть m будет строкой, состоящей из включений символа ‘0’ в количестве f+1.

    3. Пусть e = 0.

  9. Иначе, x 0

    1. Если fractionDigits не равно undefined, то

      1. Пусть e и n будут такими целыми числами, чтобы 10f n < 10f+1, и для которых точное математическое значение n × 10efx будет как можно ближе к нулю. Если существует два таких набора целых чисел e и n, то выбрать те e и n, у которых n × 10ef больше.

    2. Иначе, fractionDigits равно undefined

      1. Пусть e, n и f будут такими целыми числами, чтобы f 0, 10f n < 10f+1, числовое значение n × 10ef было равно x, а f было как можно меньше. Обратите внимание, что десятичное представление n состоит их f+1 цифр, n не кратно 10, а младшая цифра из n не обязательно является уникально определяемой этими критериями.

    3. Пусть m будет строкой, состоящей из цифр десятичного представления n (по порядку, без начальных нулей).

  10. Если f 0, то

    1. Пусть a будет первым символом строки m, а b – оставшимися символами строки m в количестве f.

    2. Пусть m будет результатом конкатенации трёх строк: a, "." и b.

  11. Если e = 0, то

    1. Пусть c = "+".

    2. Пусть d = "0".

  12. Иначе

    1. Если e > 0, то пусть c = "+".

    2. Иначе, e ≤ 0

      1. Пусть c = "-".

      2. Пусть e = –e.

    3. Пусть d будет строкой, состоящей из цифр десятичного представления e (по порядку, без начальных нулей).

  13. Пусть m будет результатом конкатенации четырёх строк: m, "e", c и d.

  14. Вернуть результат конкатенации строк s и m.

Свойство length для метода toExponential равно 1.

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

Реализации разрешается распространять поведение метода toExponential на значения fractionDigits, меньших 0 или больших 20. В этом случае метод toExponential не обязательно будет генерировать для таких значений исключение RangeError.

ПРИМЕЧАНИЕ Для реализаций, обеспечивающих более точные преобразования, чем требуют вышеперечисленные правила, рекомендуется в качестве руководящего принципа использовать измененный вариант шага 9.b.i:

  1. Пусть e, n и f будут такими целыми числами, чтобы f 0, 10f n < 10f+1, числовое значение n × 10ef было равно x, а f было как можно меньше. Если существует несколько вариантов n, выбрать то значение n, для которого значение n × 10ef будет ближе всего к x. Если таких возможных значений n два, выбрать то из них, которое является четным.

15.7.4.7 Number.prototype.toPrecision (precision) #

Возвращает строку, содержащую текущее числовое значение либо в экспоненциальном десятичном представлении, с одной цифрой перед десятичной запятой значащей части, и с цифрами в количестве precision–1 после десятичной запятой значащей части, либо в фиксированном десятичном представлении со значащими цифрами в количестве precision. Если precision равно undefined, то вместо этого вызвать ToString (9.8.1). А именно, выполняются следующие шаги:

  1. Пусть x будет равно текущему числовому значению.

  2. Если precision равно undefined, вернуть ToString(x).

  3. Пусть p будет ToInteger(precision).

  4. Если x равно NaN, вернуть строку "NaN".

  5. Пусть s будет пустой строкой.

  6. Если x < 0, то

    1. Пусть s будет "-".

    2. Пусть x = –x.

  7. Если x = +, то

    1. Вернуть результат конкатенации строк s и "Infinity".

  8. Если p < 1 или p > 21, сгенерировать исключение RangeError.

  9. Если x = 0, то

    1. Пусть m будет строкой, состоящей из включений символа ‘0’ в количестве p.

    2. Пусть e = 0.

  10. Иначе x 0,

    1. Пусть e и n будут такими целыми числами, чтобы 10p–1 n < 10p, для которых точное математическое значение n × 10ep+1x будет как можно ближе к нулю. Если существует два таких набора целых чисел e и n, то выбрать те e и n, у которых n × 10ep+1 больше.

    2. Пусть m будет строкой, состоящей из цифр десятичного представления n (по порядку, без начальных нулей).

    3. Если e < –6 или e p, то

      1. Пусть a будет первым символом строки m, а b – оставшимися символами строки m в количестве p–1.

      2. Пусть m будет результатом конкатенации трёх строк: a, "." и b.

      3. Если e = 0, то

        1. Пусть c = "+" и d = "0".

      4. Иначе, e 0,

        1. Если e > 0, то

          1. Пусть c = "+".

        2. Иначе, e < 0,

          1. Пусть c = "-".

          2. Пусть e = –e.

        3. Пусть d будет строкой, состоящей из цифр десятичного представления e (по порядку, без начальных нулей).

      5. Пусть m будет результатом конкатенации пяти строк: s, m, "e", c и d.

  11. Если e = p–1, вернуть результат конкатенации строк s и m.

  12. Если e 0, то

    1. Пусть m будет результатом конкатенации первых символов m в количестве e+1, символа ‘.’, и оставшихся символов m в количестве p– (e+1).

  13. Иначе, e < 0,

    1. Пусть m будет результатом конкатенации строки "0.", экземпляров символа ‘0’ в количестве –(e+1) и строки m.

  14. Вернуть результат конкатенации строк s и m.

Свойство length для метода toPrecision равно 1.

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

Реализации разрешается распространять поведение метода toPrecision на значения precision, меньших 1 или больших 21. В этом случае метод toPrecision не обязательно будет генерировать для таких значений исключение RangeError.

15.7.5 Свойства экземпляров Number #

Экземпляры Number наследуют свойства объекта-прототипа Number. Значение их внутреннего свойства [[Class]] равно "Number". Кроме того, экземпляры Number имеют внутреннее свойство [[PrimitiveValue]].

Внутреннее свойство [[PrimitiveValue]] представляет собой значение Number, представленное текущим объектом Number).