- 9. Преобразование типов
-
Среда выполнения ECMAScript выполняет автоматическое преобразование типа по необходимости. Чтобы разъяснить семантику, полезно определить набор операторов преобразования. Эти операторы не являются частью языка. Они определены здесь для удобства определения семантики языка. Операторы сравнения полиморфны, то есть они могут принимать значения любых стандартных типов, кроме типов Reference, List или Completion (т.е. внутренних типов).
- 9.1 ToPrimitive
-
Оператор ToPrimitive ("к элементарному") принимает аргумент Значение и опциональный аргумент ПредпочтительныйТип. Оператор ToPrimitive преобразует свой аргумент-значение в тип, не являющийся типом Object. Если объект может быть преобразован к более чем одному элементарному типу, он может использовать опциональную подсказку ПредпочтительныйТип, чтобы выбрать один из них. Преобразование происходит согласно следующей таблице:
Входной тип |
Результат |
Undefined |
Результат совпадает с входным аргументом (преобразование не производится). |
Null |
Результат совпадает с входным аргументом (преобразование не производится). |
Boolean |
Результат совпадает с входным аргументом (преобразование не производится). |
Number |
Результат совпадает с входным аргументом (преобразование не производится). |
String |
Результат совпадает с входным аргументом (преобразование не производится). |
Object |
Возвращает значение по умолчанию для объекта. Значение по умолчанию для объекта получается путём вызова для объекта внутреннего метода [[DefaultValue]] с передачей ему опциональной подсказки ПредпочтительныйТип. Поведение метода [[DefaultValue]] определяется данной спецификацией для всех встроенных объектов ECMAScript (8.6.2.6). |
- 9.2 ToBoolean
-
Оператор ToBoolean ("к булевскому") преобразует свой аргумент в значение типа Boolean согласно следующей таблице:
Входной тип |
Результат |
Undefined |
false |
Null |
false |
Boolean |
Результат совпадает с входным аргументом (преобразование не производится). |
Number |
Результат равен false, если аргумент равен +0, -0 или NaN, иначе результат равен true. |
String |
Результат равен false, если аргумент является пустой строкой (его длина равна нулю), иначе результат равен true. |
Object |
true |
- 9.3 ToNumber
-
Оператор ToNumber ("к числу") преобразует свой аргумент в значение типа Number согласно следующей таблице:
Входной тип |
Результат |
Undefined |
NaN |
Null |
+0 |
Boolean |
Результат равен 1, если аргумент равен true. Результат равен +0, если аргумент равен false. |
Number |
Результат совпадает с входным аргументом (преобразование не производится). |
String |
См. грамматику и замечание ниже. |
Object |
Применяются следующие шаги: 1. Вызвать ToPrimitive(входной аргумент, подсказка Number).
2. Вызвать ToNumber(Результат(1)).
3. Вернуть Результат(2).
|
- 9.3.1 ToNumber в применении к типу String
-
Когда метод ToNumber вызывается для строки, он применяет к ней следующую грамматику. Если грамматика не может расшифровать строку как нетерминал СтроковойЧисленныйЛитерал, то результатом вызова ToNumber является NaN.
- СтроковойЧисленныйЛитерал :::
- СтрПробеловопц
СтрПробеловопц СтрЧисленныйЛитерал СтрПробеловопц
- СтрПробелов :::
- СтрСимвПробела СтрПробеловопц
- СтрСимвПробела :::
- <TAB>
<SP>
<NBSP>
<FF>
<VT>
<CR>
<LF>
<LS>
<PS>
<USP>
- СтрЧисленныйЛитерал :::
- СтрДесятичныйЛитерал
ШестнадцатеричныйЦелыйЛитерал
- СтрДесятичныйЛитерал :::
- СтрБеззнаковыйДесятичныйЛитерал
+ СтрБеззнаковыйДесятичныйЛитерал
- СтрБеззнаковыйДесятичныйЛитерал
- СтрБеззнаковыйДесятичныйЛитерал :::
- Infinity
ДесятичныеЦифры . ДесятичныеЦифрыопц ЭкспоненциальнаяЧастьопц
. ДесятичныеЦифры ЭкспоненциальнаяЧастьопц
ДесятичныеЦифры ЭкспоненциальнаяЧастьопц
- ДесятичныеЦифры :::
- ДесятичнаяЦифра
ДесятичныеЦифры ДесятичнаяЦифра
- ДесятичнаяЦифра ::: одна из
- 0 1 2 3 4 5 6 7 8 9
- ЭкспоненциальнаяЧасть :::
- ПризнакЭкспоЗаписи ЗнаковоеЦелое
- ПризнакЭкспоЗаписи ::: один из
- e E
- ЗнаковоеЦелое :::
- ДесятичныеЦифры
+ ДесятичныеЦифры
- ДесятичныеЦифры
- ШестнадцатеричныйЦелыйЛитерал :::
- ШестнадцатеричнаяЦифра0x ШестнадцатеричнаяЦифра
0X ШестнадцатеричнаяЦифра
ШестнадцатеричныйЦелыйЛитерал ШестнадцатеричнаяЦифра
- ШестнадцатеричнаяЦифра ::: одна из
- 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
Следует отметить некоторые различия между синтаксисом СтроковогоЧисленногоЛитерала и ЧисленногоЛитерала (см. 7.8.3):
- Перед или после СтроковогоЧисленногоЛитерала могут идти пробелы и/или концы строк.
- В начале десятичного СтроковогоЧисленногоЛитерала может идти любое количество цифр 0.
- Перед СтроковымДесятичнымЛитералом может встретиться символ + или -, который определяет его знак.
- Пустой или состоящий из одних пробелов СтроковойЧисленныйЛитерал преобразует в +0.
Преобразование строки в численное значение в целом сходно с определением численного значения численного литерала (см. 7.8.3), но различается в некоторых деталях, поэтому процесс преобразования строкового численного литерала в значение типа Number приводится здесь целиком. Значение определяется в два шага: сначала математическое значение (МЗ) получается из строкового численного литерала, потом математическое значение округляется согласно описанной ниже схеме:
- МЗ СтроковогоЧисленногоЛитерала ::: [пусто] равно 0.
- МЗ СтроковогоЧисленногоЛитерала ::: СтрПробелов равно 0.
- МЗ СтроковогоЧисленногоЛитерала ::: СтрПробеловопц СтрЧисленногоЛитерала СтрПробеловопц равно МЗ СтрЧисленногоЛитерала вне зависимости от того, присутствуют пробелы или нет.
- МЗ СтрЧисленногоЛитерала ::: СтрДесятичногоЛитерала равняется МЗ СтрДесятичногоЛитерала.
- МЗ СтрЧисленногоЛитерала ::: ШестнадцатеричногоЦелогоЛитерала равняется МЗ ШестнадцатеричногоЦелогоЛитерала.
- МЗ СтрЧисленногоЛитерала ::: СтрДесятичногоЛитерала равняется МЗ СтрДесятичногоЛитерала.
- МЗ СтрЧисленногоЛитерала ::: + СтрБеззнаковогоДесятичногоЛитерала равняется МЗ СтрБеззнаковогоДесятичногоЛитерала.
- МЗ СтрЧисленногоЛитерала ::: - СтрБеззнаковогоДесятичногоЛитерала равняется МЗ СтрБеззнаковогоДесятичногоЛитерала, взятому с отрицательным знаком. (Заметим, что если МЗ СтрБеззнаковогоДесятичногоЛитерала равно 0, отрицательным значением для него тоже берётся 0. Описанное ниже правило округления производит округление этого беззнакового метатематического нуля до +0 или -0 в зависимости от обстоятельств.)
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: Infinity ("бесконечности") равняется 1010000 (т.е. столь большое значение, что оно округлится до +∞ ).
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр. равно МЗ ДесятичныхЦифр. МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр. ДесятичныхЦифр равно сумме МЗ первых ДесятичныхЦифр и (МЗ вторых ДесятичныхЦифр, умноженного на 10-n ), где n - число символов во вторых ДесятичныхЦифрах.
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр. ЭкспоненциальнойЧасти равно МЗ ДесятичныхЦифр умноженному на 10e, где e равно МЗ ЭкспоненциальнойЧасти.
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр. ДесятичныхЦифр ЭкспоненциальнойЧасти равно МЗ суммы первых ДесятичныхЦифр и (МЗ вторых ДесятичныхЦифр, умноженному на 10-n )), умноженной на 10e, где n - число символов во вторых ДесятичныхЦифрах и e равно МЗ ЭкспоненциальнойЧасти.
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: . ДесятичныхЦифр равно МЗ ДесятичныхЦифр умноженному на 10-n, где n равно числу символов в ДесятичныхЦифрах.
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: . ДесятичныхЦифр ЭкспоненциальнойЧасти равно МЗ ДесятичныхЦифр умноженному на 10e-n, где n равно числу символов в ДесятичныхЦифрах, а e равно МЗ ЭкспоненциальнойЧасти.
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр равно МЗ ДесятичныхЦифр.
- МЗ СтрБеззнаковогоДесятичногоЛитерала ::: ДесятичныхЦифр ЭкспоненциальнойЧасти равно МЗ ДесятичныхЦифр умноженному на 10e, где e равно МЗ ЭкспоненциальнойЧасти.
- МЗ ДесятичныхЦифр ::: ДесятичнойЦифры равно МЗ ДесятичнойЦифры. МЗ ДесятичныхЦифр ::: ДесятичныхЦифр ДесятичнойЦифры равно сумме (МЗ ДесятичныхЦифр умноженного на 10) и МЗ ДесятичнойЦифры.
- МЗ ЭкспоненциальнойЧасти ::: ПризнакаЭкспоЗаписи ЗнаковогоЦелого равняется МЗ ЗнаковогоЦелого.
- МЗ ЗнаковогоЦелого ::: ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.
- МЗ ЗнаковогоЦелого ::: + ДесятичныхЦифр равняется МЗ ДесятичныхЦифр.
- МЗ ЗнаковогоЦелого ::: - ДесятичныхЦифр равняется взятому с отрицательным знаком МЗ ДесятичныхЦифр.
- МЗ ДесятичнойЦифры ::: 0 или ШестнадцатеричнойЦифры ::: 0 равняется 0.
- МЗ ДесятичнойЦифры ::: 1 или ШестнадцатеричнойЦифры ::: 1 равняется 1.
- МЗ ДесятичнойЦифры ::: 2 или ШестнадцатеричнойЦифры ::: 2 равняется 2.
- МЗ ДесятичнойЦифры ::: 3 или ШестнадцатеричнойЦифры ::: 3 равняется 3.
- МЗ ДесятичнойЦифры ::: 4 или ШестнадцатеричнойЦифры ::: 4 равняется 4.
- МЗ ДесятичнойЦифры ::: 5 или ШестнадцатеричнойЦифры ::: 5 равняется 5.
- МЗ ДесятичнойЦифры ::: 6 или ШестнадцатеричнойЦифры ::: 6 равняется 6.
- МЗ ДесятичнойЦифры ::: 7 или ШестнадцатеричнойЦифры ::: 7 равняется 7.
- МЗ ДесятичнойЦифры ::: 8 или ШестнадцатеричнойЦифры ::: 8 равняется 8.
- МЗ ДесятичнойЦифры ::: 9 или ШестнадцатеричнойЦифры ::: 9 равняется 9.
- МЗ ШестнадцатеричнойЦифры ::: a или ШестнадцатеричнойЦифры ::: A равняется 10.
- МЗ ШестнадцатеричнойЦифры ::: b или ШестнадцатеричнойЦифры ::: B равняется 11.
- МЗ ШестнадцатеричнойЦифры ::: c или ШестнадцатеричнойЦифры ::: C равняется 12.
- МЗ ШестнадцатеричнойЦифры ::: d или ШестнадцатеричнойЦифры ::: D равняется 13.
- МЗ ШестнадцатеричнойЦифры ::: e или ШестнадцатеричнойЦифры ::: E равняется 14.
- МЗ ШестнадцатеричнойЦифры ::: f или ШестнадцатеричнойЦифры ::: F равняется 15.
- МЗ ШестнадцатеричногоЦелогоЛитерала
::: 0x ШестнадцатеричнойЦифры равняется МЗ ШестнадцатеричнойЦифры.
- МЗ ШестнадцатеричногоЦелогоЛитерала
::: 0X ШестнадцатеричнойЦифры равняется МЗ ШестнадцатеричнойЦифры.
- МЗ ШестнадцатеричногоЦелогоЛитерала ::: ШестнадцатеричногоЦелогоЛитерала ШестнадцатеричнойЦифры равняется сумме (МЗ ШестнадцатеричногоЦелогоЛитерала умноженного на 16) и МЗ ШестнадцатеричнойЦифры.
После того как для строкового численного литерала было определено точное МЗ, оно округляется к значению типа Number. Если МЗ равно 0, то округлённое значение обычно равно +0. Исключение составляют случаи, когда первым непробельным символом строкового численного литерала является '-', тогда округлённое значение равно -0. Для других значений МЗ в качестве округлённого берётся численное значение для МЗ (согласно определению в разделе 8.5), за исключением тех случаев, когда литерал включает в себя СтрБеззнаковыйДесятичныйЛитерал и содержит более 20 значащих цифр. Тогда за численное значение принимается либо численное значение МЗ литерала, получаемое заменой каждой значащей цифры после двадцатой на цифру 0, либо численное значение МЗ литерала, получаемое заменой каждой значащей цифры после двадцатой на цифру 0 и затем увеличением литерала на единицу в позиции двадцатой значащей цифры. Цифра является значащей, если она не принадлежит ЭкспоненциальнойЧасти и
- она не равна 0, или
- слева от неё есть ненулевая цифра и справа от неё есть ненулевая цифра, не принадлежащая ЭкспоненциальнойЧасти.
- 9.4 ToInteger
-
Оператор ToInteger ("к целому") преобразует свой аргумент в целочисленное значение. Оператор работает по следующей схеме:
1. Вызвать оператор ToNumber для входного аргумента.
2. Если Результат(1) равен NaN - вернуть +0.
3. Если Результат(1) равен +0, -0, +∞ или -∞ - вернуть Результат(1).
4. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).
5. Вернуть Результат(4).
- 9.5 ToInt32: (Знаковое 32-разрядное целое)
-
Оператор ToInt32 преобразует свой аргумент к одному из 232 целых значений в диапазоне от -231 до 231-1 включительно. Оператор работает по следующей схеме:
1. Вызвать оператор ToNumber для входного аргумента.
2. Если Результат(1) равен NaN, +0, -0, +∞ или -∞ - вернуть +0.
3. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).
4. Вычислить Результат(3) modulo 232, т.е. конечное целочисленное значение k типа Number с положительным знаком и меньшее 232 такое, что разница между Результатом(3) и k математически кратна 232 .
5. Если Результат(4) больше или равен 231 - вернуть Результат(4)-232 , иначе вернуть Результат(4).
ЗАМЕЧАНИЕ
Для вышеприведённого определения ToInt32:
Операция ToInt32 является тождественной: если она применяется к результату применения этой операции, второе применение не меняет результата.
ToInt32(ToUint32(x)) эквивалентно ToInt32(x) для всех значений x. (Именно для сохранения этого последнего свойства +∞ и -∞ отображаются на +0.)
ToInt32 отображает -0 на +0.
- 9.6 ToUint32: (Беззнаковое 32-разрядное целое)
-
Оператор ToInt32 преобразует свой аргумент к одному из 232 целых значений в диапазоне от 0 до 232-1 включительно. Оператор работает по следующей схеме:
1. Вызвать оператор ToNumber для входного аргумента.
2. Если Результат(1) равен NaN, +0, -0, +∞ или -∞ - вернуть +0.
3. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).
4. Вычислить Результат(3) modulo 232, т.е. конечное целочисленное значение k типа Number с положительным знаком и меньшее 232 такое, что разница между Результатом(3) и k математически кратна 232 .
5. Вернуть Результат(4).
ЗАМЕЧАНИЕ
Для вышеприведённого определения ToUInt32:
Шаг 5 является единственным различием между ToUint32 и ToInt32.
Операция ToUint32 является тождественной: если она применяется к результату применения этой операции, второе применение не меняет результата.
ToUint32(ToInt32(x)) эквивалентно ToUint32(x) для всех значений x. (Именно для сохранения этого последнего свойства +∞ и -∞ отображаются на +0.)
ToUint32 отображает -0 на +0.
- 9.7 ToUint16: (Беззнаковое 16-разрядное целое)
-
Оператор ToUint16 преобразует свой аргумент к одному из 216 целых значений в диапазоне от 0 до 216-1 включительно. Оператор работает по следующей схеме:
1. Вызвать оператор ToNumber для входного аргумента.
2. Если Результат(1) равен NaN, +0, -0, +∞ или -∞ - вернуть +0.
3. Вычислить sign(Результат(1)) * floor(abs(Результат(1))).
4. Вычислить Результат(3) modulo 216, т.е. конечное целочисленное значение k типа Number с положительным знаком и меньшее 216 такое, что разница между Результатом(3) и k математически кратна 216 .
5. Вернуть Результат(4).
ЗАМЕЧАНИЕ
Для вышеприведённого определения ToUint16:
Замена 232 на 216 на шаге 4 является единственным различием между ToUint32 и ToUint16.
ToUint16 отображает -0 на +0.
- 9.8 ToString
-
Оператор ToString (" к строке") преобразует свой аргумент к значению типа String согласно следующей таблице:
Входной тип |
Результат |
Undefined |
"undefined" |
Null |
"null" |
Boolean |
Если аргумент равен true, то результат равен "true". Если аргумент равен false, то результат равен "false". |
Number |
См. замечание ниже. |
String |
Возвращает входной аргумент (преобразование не производится) |
Object |
Применяются следующие шаги: 1. Вызвать ToPrimitive(входной аргумент, подсказка String). 2. Вызвать ToString(Результат(1)). 3. Вернуть Результат(2). |
- 9.8.1 ToString применённый к типу Number
-
Оператор ToString преобразует число m в строковой формат по следующей схеме:
1. Если m равно NaN - вернуть строку "NaN".
2. Если m равно +0 или -0 - вернуть строку "0".
3. Если m меньше нуля - вернуть строковую конкатенацию строки "-" и ToString(-m).
4. Если m является бесконечностью - вернуть строку "Infinity".
5. В прочих случаях, пусть n, k и s - такие целые, что k >= 1, 10k-1<= s <10k, численное значение s * 10n-k равно m и k имеет наименьшее из возможных значений. Заметим, что k равно количеству цифр в десятичном представлении s, что s не делится на 10 и что младший десятичный разряд s не обязательно однозначно определяется этими критериями.
6. Если k <= n <= 21 - вернуть строку, состоящую из k цифр численного представления s (по порядку разрядов, без лишних начальных нулей), за которым следуют n k символов '0'.
7. Если 0 < n <= 21 - вернуть строку, состоящую n старших цифр десятичного представления s, за которыми следуют десятичная точка '. ' и оставшиеся k-n цифр десятичного представления s.
8. Если -6 <n <= 0 - вернуть строку, состоящую из символа '0', за которыми следуют десятичная точка '. ', -n символов '0' и k цифр десятичного представления s.
9. Иначе, если k = 1 - вернуть строку s, за которой следует символ латиницы нижнего регистра 'e', знак плюс '+' или минус '-' (в зависимости от того, положительно n-1 или отрицательно), за которым следует десятичное представление целого abs(n-1) (без лишних начальных нулей).
10. Вернуть строку, состоящую из старшей цифры десятичного представления s, за которой следуют десятичная точка '. ', оставшиеся k-1цифр десятичного представления s, за которыми следует символ латиницы нижнего регистра 'e', знак плюс '+' или минус '-' (в зависимости от того, положительно n-1 или отрицательно), за которым следует десятичное представление целого abs(n-1) (без лишних начальных нулей).
ЗАМЕЧАНИЕ
Следующие наблюдения могут служить рекомендациями для создателей реализаций, но не являются частью нормативных требований данного Стандарта:
Если x - некоторое численное значение, не равное -0, то ToNumber(ToString(x)) в точности совпадает с значением x.
Младшая десятичная цифра s не всегда однозначно определяется требованиями шага 5.
Для реализаций, которые обеспечивают более точные преобразования, чем требуемые в правилах выше, рекомендуется использовать следующую альтервстроенную версию шага 5:
В прочих случаях, пусть n, k и s - такие целые, что k >= 1, 10k-1<= s <10k, численное значение s * 10n-k равно m и k имеет наименьшее из возможных значений. Если существует несколько подходящих значений для s - выбрать из них то, для которого s * 10n-k является ближайшим к m. Если существует два таких возможных значения s - выбрать из них чётное. Заметим, что k равно количеству цифр в десятичном представлении s и что s не делится на 10.
Создателям реализаций ECMAScript рекомендуется изучить работу Дэвида М. Гэя по преобразованиям чисел с плавающей точкой из двоичного формата в десятичный:
Gay, David M. Correctly Rounded Binary-Decimal and Decimal-Binary Conversions. Numerical Analysis Manuscript 90-10. AT&T Bell Laboratories (Murray Hill, New Jersey). November 30, 1990. Доступна по адресу http://cm.bell-labs.com/cm/cs/doc/90/4-10.ps.gz. Исходные коды программ из данной работы доступны по адресам http://cm.bell-labs.com/netlib/fp/dtoa.c.gz и http://cm.bell-labs.com/netlib/fp/g_fmt.c.gz, а также на различных сайтах-зеркалах netlib.
- 9.9 ToObject
-
Оператор ToObject ("к объекту") преобразует свой аргумент в значение типа Object согласно следующей таблице:
Входной тип |
Результат |
Undefined |
Бросить исключение TypeError. |
Null |
Бросить исключение TypeError. |
Boolean |
Создать новый объект Boolean со свойством [[value]] равным входному булевскому значению. Описание объектов Boolean см. в разделе 15.6. |
Number |
Создать новый объект Number со свойством [[value]] равным входному численному значению. Описание объектов Number см. в разделе 15.7. |
String |
Создать новый объект String со свойством [[value]] равным входному строковому значению. Описание объектов String см. в разделе 15.7. |
Object |
Результат совпадает с входным аргументом (преобразование не производится). |
Такие сложности в преобразовании ToNumber....
Названия всех операторов должны начинаться с маленькой буквы - например не "ToString", а "toString". Исправьте.
В начале страницы четко сказано, что операторы не являются частью языка - а введены они для лутчего понимания как же все таки среда преобразует один тип в другой в случаи надобности.
Как обазначить данные операторы (с маленькой буквы или с большой) дело второстепенное.
Жаль, что нет ни одного примера. Это вызывает у меня затруднения.
Спасибо. Взял на заметку
Кому нужно преобразовать из строки в число есть такой способ:
Ну, или
+'3.14'