本頁の目次 目次 次頁: 10_Execution_Contexts 前頁: 8_Types
ECMAScript ランタイムシステムは、必要時に自動型変換を行う。一定の構成物の意味論を計画にするため、変換演算子のセットの定義が有用である。これらの演算子は言語の一部ではない; ここでは、言語の意味論の仕様を助けるためにこれらを定義する。変換演算子は多様的である; つまり、標準的な型を受け入れることはできるが、 Reference, List, Completion (内部的型) を受け入れることはできない。
ToPrimitive 演算子は引数 Value と選択的な引数 PreferredType をとる。 ToPrimitive 演算子はその引数の値を非 Object 型に変換する。オブジェクトが一つ以上のプリミティブ型に変換可能である場合、選択的な PreferredType ヒントをそのタイプに選んでよい。変換は次の表にしたがって発生する:
入力型 | 結果 |
Undefined | 結果は入力引数と等しい。(無変換) |
Null | 結果は入力引数と等しい。(無変換) |
Boolean | 結果は入力引数と等しい。(無変換) |
Number | 結果は入力引数と等しい。(無変換) |
String | 結果は入力引数と等しい。(無変換) |
Object | Object のデフォルトの値を返す。オブジェクトのデフォルトの値は、オブジェクトの内部メソッド [[DefaultValue]] に選択的ヒント PreferredType を渡して取得される。[[DefalutValue]] メソッドの挙動は、全ての ECMAScript オブジェクトの仕様によって定義される。(セクション 8.6.2.6) |
ToBoolean 演算子は、次の表にしたがって引数を Boolean 型の値に変換する。
入力型 | 結果 |
Undefined | false |
Null | false |
Boolean | 結果は入力引数と等しい。(無変換) |
Number | 引数が +0, -0, NaN ならば結果は false; そうでなければ true |
String | 引数が空文字列 (長さ 0) ならば結果は false; そうでなければ true |
Object | true |
ToNumber 演算子は、次の表にしたがって引数を Number 型の値に変換する。
入力型 | 結果 |
Undefined | NaN |
Null | +0 |
Boolean | 引数が true ならば結果は 1.false ならば +0。 |
Number | 結果は入力引数と等しい。(無変換) |
String | 下の文法と注意を参照。 |
Object | 次のステップを適用:
|
文字列に適用される ToNumber は、入力文字列に 次の文法を適用する。文法が文字列を StringNumericLiteral として解釈不能ならば、 ToNumber の結果は NaN である。
StringNumericLiteral と NumericLiteral の構文間にいくつか注目すべき相違点がある (セクション 7.8.3):
文字列の数値への変換は、全体に数値リテラルの数値の決定と似ている (セクション 7.8.3) が、いくつかの点で異なり、従って string numeric literal の Number 型の値への変換処理はここに全て与えられる。この値は 2 ステップで決定される: まず、数学値 (MV) が string numeric literal から派生する; 次に、この数学値が次のように丸められる。
this
sign less mathematical zero to a floating-point +0 or -0 as appropriate )一旦数値文字列リテラルの厳密な数学値が決定されたら、 Number 型の値に丸められる。数学値が 0 ならば、丸められる値は、数値文字列リテラル内の最初の非空白文字が '-' でなければ +0 であり、 '-' ならば -0 である。 そうではなく、リテラルが StrUnsignedDecimalLiteral を含まず、そのリテラルが 20 を超える有効数字数\でなければ、数値が 20 番目以降の各有効数字を数字 0 で置換して生成されるリテラルの数学値の数値、または 20 番目以降の各有効数字を数字 0 で置換して生成されるリテラルの数学値の数値、そして 20 番目の数字の位置でリテラルを増加のどちらかでありえる場合、丸められる値は (セクション 8.5 で定義される意味の) 数学値の数値でなければならない。数字はそれが ExponentPart の一部\でなく次の二点のどちらかあれば有効数字 (significant) である。
ToInteger 演算子は引数を整数値に変換する。この演算子は次のように機能する:
ToInt32 演算子は、引数を -231 から 231-1 を含めた範囲内で、 232 個の整数値の一つに変換する。
この演算子は次のように機能する:
NOTE 上記の ToInt32 の定義を与える:
ToInt32 演算は idempotent である: 生成された結果に適用するならば、2 回目の適用は値を変更せずに残す。
x の全ての値にとって、ToInt32(ToUint32(x)) は ToInt32(x) 等価である。 (+∞ と -∞ は +0 にマップされるのは後者のプロパティの保存である。)
ToInt32 は -0 を +0 にマップする。
ToUint32 演算子は引数を、 0 から 232-1 を含む範囲の 232 個の整数値の一つに変換する。個の演算子は次のように機能する:
NOTE 上記の ToUInt32 の定義を与える:
ステップ 5 は ToUint32 と ToInt32 との間の違いである。
ToUint32 演算は idempotent である: 生成された結果に適用するならば、2 回目の適用は値を変更せずに残す。
x の全ての値にとって、ToUint32(ToInt32(x)) は ToUint32(x) 等価である。 (+∞ と -∞ は +0 にマップされるのは後者のプロパティの保存である。)
ToUint32 は -0 を +0 にマップする。
ToUint16 演算子は、引数を 0 から 216-1 までの範囲の 216 個の整数値のうちの一つに変換する。この演算は次のように機能する:
NOTE 上記の ToUint16 の定義を与える:
ToUint32 と ToUint16 との間の違いは、ステップ 4 にて 232 に 216 を代用しているだけである。
ToUint16 は -0 を +0 にマップする。
ToString 演算子は、次の表に従って引数を String 型の値に変換する。
入力型 | 結果 |
Undefined | "undefined" |
Null | "null" |
Boolean | 引数が true ならば、結果は "true" 。引数が false ならば、結果は "false" 。 |
Number | 下のノートを参照。 |
String | 入力引数を返す。 (無変換) |
Object | 次のステップを適用:
|
ToString 演算子は、次のように数 m を文字列形式に変換する:
NOTE 次の観察は実装ガイドラインとして有用かもしれないが、この標準の標準必須条件の一部ではない。
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 を選択する。 s として可能な値が 2 つあれば、偶数である方をを選ぶ。 k は s の 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 ミラーサイトでも検索できる。
ToObject 演算子は次の表に従って引数をオブジェクト型の値に変換する:
入力型 | 結果 |
Undefined | 例外 TypeError を投げる。 |
Null | 例外 TypeError を投げる。 |
Boolean | [[value]] プロパティがそのブーリアンである Boolean オブジェクトを新しく作成する。 セクション 15.6 Boolean オブジェクトの説明を参照。 |
Number | [[value]] プロパティがその数値である Number オブジェクトを新しく作成する。 セクション 15.7 Number オブジェクトの説明を参照。 |
String | [[value]] プロパティがその文字列である String オブジェクトを新しく作成する。 セクション 15.5 String オブジェクトの説明を参照。 |
Object | 結果は入力引数である (変換しない)。 |