本頁の目次 目次

9 型変換 (Type Conversion)

ECMAScript ランタイムシステムは、必要時に自動型変換を行う。一定の構成物の意味論を計画にするため、変換演算子のセットの定義が有用である。これらの演算子は言語の一部ではない; ここでは、言語の意味論の仕様を助けるためにこれらを定義する。変換演算子は多様的である; つまり、標準的な型を受け入れることはできるが、 Reference, List, Completion (内部的型) を受け入れることはできない。

9.1 ToPrimitive

ToPrimitive 演算子は引数 Value と選択的な引数 PreferredType をとる。 ToPrimitive 演算子はその引数の値を非 Object 型に変換する。オブジェクトが一つ以上のプリミティブ型に変換可能である場合、選択的な PreferredType ヒントをそのタイプに選んでよい。変換は次の表にしたがって発生する:

入力型 結果
Undefined 結果は入力引数と等しい。(無変換)
Null 結果は入力引数と等しい。(無変換)
Boolean 結果は入力引数と等しい。(無変換)
Number 結果は入力引数と等しい。(無変換)
String 結果は入力引数と等しい。(無変換)
Object Object のデフォルトの値を返す。オブジェクトのデフォルトの値は、オブジェクトの内部メソッド [[DefaultValue]] に選択的ヒント PreferredType を渡して取得される。[[DefalutValue]] メソッドの挙動は、全ての ECMAScript オブジェクトの仕様によって定義される。(セクション 8.6.2.6)

9.2 ToBoolean

ToBoolean 演算子は、次の表にしたがって引数を Boolean 型の値に変換する。

入力型 結果
Undefined false
Null false
Boolean 結果は入力引数と等しい。(無変換)
Number 引数が +0, -0, NaN ならば結果は false; そうでなければ true
String 引数が空文字列 (長さ 0) ならば結果は false; そうでなければ true
Object true

9.3 ToNumber

ToNumber 演算子は、次の表にしたがって引数を Number 型の値に変換する。

入力型 結果
Undefined NaN
Null +0
Boolean 引数が true ならば結果は 1.false ならば +0。
Number 結果は入力引数と等しい。(無変換)
String 下の文法と注意を参照。
Object 次のステップを適用:
  • 1. ToPrimitive(input argument, hint Number) を呼出す。
  • 2. ToNumber(Result(1)) を呼出す。
  • 3. Result(2) を返す。

9.3.1 String 型に適用される ToNumber (ToNumber Applied to the String Type)

文字列に適用される ToNumber は、入力文字列に 次の文法を適用する。文法が文字列を StringNumericLiteral として解釈不能ならば、 ToNumber の結果は NaN である。

StringNumericLiteral :::
StrWhiteSpaceopt
StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt
StrWhiteSpace :::
StrWhiteSpaceChar StrWhiteSpaceopt
StrWhiteSpaceChar :::
<TAB>
<SP>
<NBSP>
<FF>
<VT>
<CR>
<LF>
<LS>
<PS>
<USP>
StrNumericLiteral :::
StrDecimalLiteral
HexIntegerLiteral
StrDecimalLiteral :::
StrUnsignedDecimalLiteral
+ StrUnsignedDecimalLiteral
- StrUnsignedDecimalLiteral
StrUnsignedDecimalLiteral :::
Infinity
DecimalDigits . DecimalDigitsopt ExponentPartopt
. DecimalDigits ExponentPartopt
DecimalDigits ExponentPartopt
DecimalDigits :::
DecimalDigit
DecimalDigits DecimalDigit
DecimalDigit ::: one of
0 1 2 3 4 5 6 7 8 9
ExponentPart :::
ExponentIndicator SignedInteger
ExponentIndicator ::: one of
e E
SignedInteger :::
DecimalDigits
+ DecimalDigits
- DecimalDigits
HexIntegerLiteral :::
0x HexDigit
0X HexDigit
HexIntegerLiteral HexDigit
HexDigit ::: one of
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

StringNumericLiteralNumericLiteral の構文間にいくつか注目すべき相違点がある (セクション 7.8.3):

文字列の数値への変換は、全体に数値リテラルの数値の決定と似ている (セクション 7.8.3) が、いくつかの点で異なり、従って string numeric literal の Number 型の値への変換処理はここに全て与えられる。この値は 2 ステップで決定される: まず、数学値 (MV) が string numeric literal から派生する; 次に、この数学値が次のように丸められる。

一旦数値文字列リテラルの厳密な数学値が決定されたら、 Number 型の値に丸められる。数学値が 0 ならば、丸められる値は、数値文字列リテラル内の最初の非空白文字が '-' でなければ +0 であり、 '-' ならば -0 である。 そうではなく、リテラルが StrUnsignedDecimalLiteral を含まず、そのリテラルが 20 を超える有効数字数\でなければ、数値が 20 番目以降の各有効数字を数字 0 で置換して生成されるリテラルの数学値の数値、または 20 番目以降の各有効数字を数字 0 で置換して生成されるリテラルの数学値の数値、そして 20 番目の数字の位置でリテラルを増加のどちらかでありえる場合、丸められる値は (セクション 8.5 で定義される意味の) 数学値の数値でなければならない。数字はそれが ExponentPart の一部\でなく次の二点のどちらかあれば有効数字 (significant) である。

  • 0 でない。
  • その左側が 0 以外の数字でその右側が 0 以外の数字で ExponentPart 内でない。

9.4 ToInteger

ToInteger 演算子は引数を整数値に変換する。この演算子は次のように機能する:

  1. 入力引数に ToNumber を呼出す。
  2. Result(1) が NaN ならば、 +0 を返す。
  3. Result(1) が +0, -0, +∞, -∞ ならば、 Result(1) を返す。
  4. sign( Result(1)) * floor(abs(Result(1)) ) を算出する。
  5. Result(4) を返す。

9.5 ToInt32: (Signed 32 Bit Integer)

ToInt32 演算子は、引数を -231 から 231-1 を含めた範囲内で、 232 個の整数値の一つに変換する。

この演算子は次のように機能する:

  1. 入力引数に ToNumber を呼出す。
  2. Result(1) が NaN, +0, -0, +∞, or -∞ ならば、 +0 を返す。
  3. sign(Result(1)) * floor(abs(Result(1))) を算出する。
  4. Result(3) modulo 232 を算出する; すなわち、 Result(3) との数学的な差が数学的に 232 の整数倍であるような、大きさ 232 未満の正符号付き Number 型の 有限整数値 k である。
  5. Result(4) が 231 以上ならば、 Result(4) - 232 を返す。そうでなければ Result(4) を返す。

NOTE 上記の ToInt32 の定義を与える:

ToInt32 演算は idempotent である: 生成された結果に適用するならば、2 回目の適用は値を変更せずに残す。

x の全ての値にとって、ToInt32(ToUint32(x)) は ToInt32(x) 等価である。 (+∞ と -∞ は +0 にマップされるのは後者のプロパティの保存である。)

ToInt32 は -0 を +0 にマップする。

9.6 ToUint32: (Unsigned 32 Bit Integer)

ToUint32 演算子は引数を、 0 から 232-1 を含む範囲の 232 個の整数値の一つに変換する。個の演算子は次のように機能する:

  1. 入力引数に ToNumber を呼出す。
  2. Result(1) が NaN, +0, -0, +∞, -∞ ならば、 +0 を返す。
  3. sign(Result(1)) * floor(abs(Result(1))) を算出する。
  4. Result(3) modulo 232 を算出する; すなわち、 Result(3) と k との数学的な差が数学的に 232 の整数倍であるような、大きさ 232 未満の正符号付き Number 型の有限整数値 k である。
  5. Result(4) を返す。

NOTE 上記の ToUInt32 の定義を与える:

ステップ 5 は ToUint32 と ToInt32 との間の違いである。

ToUint32 演算は idempotent である: 生成された結果に適用するならば、2 回目の適用は値を変更せずに残す。

x の全ての値にとって、ToUint32(ToInt32(x)) は ToUint32(x) 等価である。 (+∞ と -∞ は +0 にマップされるのは後者のプロパティの保存である。)

ToUint32 は -0 を +0 にマップする。

9.7 ToUint16: (Unsigned 16 Bit Integer)

ToUint16 演算子は、引数を 0 から 216-1 までの範囲の 216 個の整数値のうちの一つに変換する。この演算は次のように機能する:

  1. 入力引数に ToNumber を呼出す。
  2. Result(1) が NaN, +0, -0, +∞, -∞ ならば、 +0 を返す。
  3. sign(Result(1)) * floor(abs(Result(1))) を算出する。
  4. Result(3) modulo 216 を算出する; すなわち、 Result(3) と k との数学的な差が数学的に 216 の整数倍であるような、大きさ 216 未満の正符号付き Number 型の有限整数値 k である。
  5. Result(4) を返す。

NOTE 上記の ToUint16 の定義を与える:

ToUint32 と ToUint16 との間の違いは、ステップ 4 にて 232 に 216 を代用しているだけである。

ToUint16 は -0 を +0 にマップする。

9.8 ToString

ToString 演算子は、次の表に従って引数を String 型の値に変換する。

入力型 結果
Undefined "undefined"
Null "null"
Boolean 引数が true ならば、結果は "true" 。引数が false ならば、結果は "false" 。
Number 下のノートを参照。
String 入力引数を返す。 (無変換)
Object 次のステップを適用:
  • ToPrimitive(入力引数, hint String) を呼出す。
  • ToString(Result(1)) を呼出す。
  • Result(2) を返す。

9.8.1 Number 型に適用される ToString (ToString Applied to the Number Type)

ToString 演算子は、次のように数 m を文字列形式に変換する:

  1. m が NaN ならば、文字列 "NaN" を返す。
  2. m が +0 または -0 ならば、文字列 "0" を返す。
  3. m が 0 未満ならば、文字 "-" と ToString(-m) を連結した文字列を返す。
  4. m が無限数ならば文字列 "Infinity" を返す。
  5. そうでないならば、 n, k, s を、 k ≥ 1, 10k-1s < 10k, s × 10n-k の数値が m, 可能な限り小さい k であるような整数とする。 ks の 10 進表記の字数であること、 s は 10 で割りきれないこと、 s の最小桁数字はこれらの基準によって必ずしも一意に決定されないことに注意。
  6. kn ≤ 21 ならば、 n-k 個の文字 '0' の出現の続く、 s の 10 進表記である k 個の数字 (0 は先行しない) で構成する文字列を返す。
  7. 0 < n ≤ 21 ならば、最大桁 s の 10 進表記の n 個の数字, 小数点 '.', s の 10 進表記の残りの k-n 個の数字の続く文字列を返す。
  8. -6 < n ≤ 0 ならば、文字 '0', 小数点 '.', -n 個の文字 '0', s の 10 進表記である k の続く文字列を返す。
  9. そうでなければ、 k = 1 ならば、 s の単一の数字, 小文字 'e', n-1 の正負に従う正符号 '+' または負符号 '-', 整数 abs(n-1) の 10 進表記 (0 は先行しない) の続く文字列を返す。
  10. s の 10 進表記の最大桁の数字, 小数点 '.', s の 10 進表記の残り k-1 個の数字, 小文字 'e', n-1 の正負に従う正符号 '+' または負符号 '-', 整数 abs(n-1) の 10 進表記 (0 は先行しない) の続く文字列を返す。

NOTE 次の観察は実装ガイドラインとして有用かもしれないが、この標準の標準必須条件の一部ではない。

x が -0 以外の任意の数値ならば、 ToNumber(ToString(x)) は厳密に x と同じ数値である。

s の最小桁数字は、ステップ 5 に挙げた要求によって常に一意に決定されるとは限らない。

上記の規則によって要求されるよりも拠り正確な規定を提供する実装には、次のステップ 5 の代替バージョンをガイドラインとして使用することが奨められる:

そうでないならば、 n, k, sk ≧ 1, 10k-1s < 10k, s × 10n-k の数値を m, k はできるだけ小さいような整数値とする。 s が複数存在しうるならば、 s × 10n-k が値で m に最も近くなるような s を選択する。 s として可能な値が 2 つあれば、偶数である方をを選ぶ。 ks の 10 進表記の数字の数で、 s は 10 で割り切れないことに注意。

ECMAScript 実装者は、浮動小数点数の 2 進数から 10 進数への変換のために David M. Gay による役に立つペーパー及びコードを検索できる:

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 演算子は次の表に従って引数をオブジェクト型の値に変換する:

入力型 結果
Undefined 例外 TypeError を投げる。
Null 例外 TypeError を投げる。
Boolean [[value]] プロパティがそのブーリアンである Boolean オブジェクトを新しく作成する。 セクション 15.6 Boolean オブジェクトの説明を参照。
Number [[value]] プロパティがその数値である Number オブジェクトを新しく作成する。 セクション 15.7 Number オブジェクトの説明を参照。
String [[value]] プロパティがその文字列である String オブジェクトを新しく作成する。 セクション 15.5 String オブジェクトの説明を参照。
Object 結果は入力引数である (変換しない)。

Page Contents

Issued: / Revised: / All rights reserved. © 2002-2016 TAKI