訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
ECMAScriptランタイムシステムは必要都度、自動的に型変換を実行します。 特定の構造を明確にするセマンティクスは、変換抽象操作の設定を定義するのに便利です。 これら抽象操作は、言語の一部ではありません。 それらは、言語のセマンティクスの仕様を補完する為にここで定義されます。 変換抽象操作は、ポリモーフィック(多様/多形/多型)的な部分があります。 つまり、仕様の型だけではなく、何らかのECMAScript言語の型の値をも許容することができるということです。
抽象操作ToPrimitiveは、引数と付加的な引数PreferredTypeをその入力として取ります。 抽象操作ToPrimitiveは、その入力される引数を非Object型に変換します。 もし、オブジェクトが1つ以上の原始的(プリミティブ)な型に変換することができる場合には、それは、その型を補完する付加的なヒント PreferredType を使用する場合があります。 変換は、Table 10によって発生します。
Table 10 -- ToPrimitive変換 --------------------------------------------------------------------------------------------------------------------------------------------------------- 入力タイプ 結果 --------------------------------------------------------------------------------------------------------------------------------------------------------- Undefined 結果は入力となる引数と同等(変換なし) Null 結果は入力となる引数と同等(変換なし) Boolean 結果は入力となる引数と同等(変換なし) Number 結果は入力となる引数と同等(変換なし) String 結果は入力となる引数と同等(変換なし) Object Objectにおける既定値を返す オブジェクトの既定値は、付加的なヒントであるPreferredTypeを渡して当該オブジェクトの[[DefaultValue]]内部プロパティを呼ぶことによって取得 [[DefaultValue]]内部プロパティの動作については、8.12.8.で全てのネイティブECMAScriptオブジェクトについてこの仕様によって定義される ---------------------------------------------------------------------------------------------------------------------------------------------------------
抽象操作ToBooleanは、Table 11 によって、その引数をBoolean型の値に変換します。
Table 11 -- ToBoolean変換 ------------------------------------------------------------------------------------------------------ 引数の型 結果 ------------------------------------------------------------------------------------------------------ Undefined false Null false Boolean 結果は入力となる引数と同等(変換なし) Number 引数が+0、-0、NaN (Not a Number)の場合、false、それ以外の場合、その結果はtrue String 引数が(その長さがゼロの)カラの文字列である場合、false、それ以外の場合、その結果はtrue Object true ------------------------------------------------------------------------------------------------------
抽象操作ToNumberは、Table 12 によって、その引数をNumber型の値に変換します。
Table 12 ToNumber変換 -------------------------------------------------------------------------------- 引数の型 結果 -------------------------------------------------------------------------------- Undefined NaN (Not a Number) Null +0 Boolean 引数がtrueの場合、結果は1 引数がfalseの場合、その結果は+0 Number 結果は入力となる引数と同等(変換なし) String 文法と以降の注釈参照 Object 次のステップで適用 1. primValue は、ToPrimitive(input argument, hint Number) とする 2. ToNumber(primValue)を返す --------------------------------------------------------------------------------
文字列(Strings)に適用したToNumberは、String型をその入力とする為に次の文法を適用します。 文法が、StringNumericLiteralの拡張としてString型を解釈できない場合には、ToNumberの結果は、NaNになります。
【構文】 StringNumericLiteral ::: StrWhiteSpaceopt StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpaceopt StrWhiteSpaceChar ::: WhiteSpace LineTerminator StrNumericLiteral ::: StrDecimalLiteral HexIntegerLiteral StrDecimalLiteral ::: StrUnsignedDecimalLiteral + StrUnsignedDecimalLiteral - StrUnsignedDecimalLiteral StrUnsignedDecimalLiteral ::: Infinity DecimalDigits . DecimalDigitsopt ExponentPartopt . DecimalDigits ExponentPartopt DecimalDigits ExponentPartopt DecimalDigits ::: DecimalDigit DecimalDigits DecimalDigit DecimalDigit ::: 0 1 2 3 4 5 6 7 8 9 の何れか1つ ExponentPart ::: ExponentIndicator SignedInteger ExponentIndicator ::: e E の何れか SignedInteger ::: DecimalDigits + DecimalDigits - DecimalDigits HexIntegerLiteral ::: 0x HexDigit 0X HexDigit HexIntegerLiteral HexDigit HexDigit ::: 0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F の何れか1つ
一部異なるのは、StringNumericLiteral と NumericLiteral ( 7.8.3 参照)の構文の間で留意されるべきであるということです。
StringからNumberの値に変換することは、全体的には、数値リテラルにおけるNumber値の決定( 7.8.3 参照)に似ており、一部詳細は異なるものの、String数値リテラルからNumber型への変換におけるプロセスは、ここで全て与えられます。 この値は、2つのステップで決定されます。 まず、数学的な値 (MV) は、文字列の数値リテラルから継承され、次にこの数学的な値は、次で説明したように丸められ(丸め処理が行われ)ます。
・StringNumericLiteral の MV ::: [empty] は 0 ・StringNumericLiteral の MV ::: StrWhiteSpace は 0 ・StringNumericLiteral の MV ::: StrWhiteSpaceopt StrNumericLiteral StrWhiteSpaceopt は ホワイトスペースの有無に関わらず、StrNumericLiteral の MV ・StringNumericLiteral の MV ::: StrDecimalLiteral は StrDecimalLiteral の MV ・StringNumericLiteral の MV ::: HexIntegerLiteral は HexIntegerLiteral の MV ・StringNumericLiteral の MV ::: StrUnsignedDecimalLiteral は StrUnsignedDecimalLiteral の MV ・StringNumericLiteral の MV ::: + StrUnsignedDecimalLiteral は StrUnsignedDecimalLiteral の MV ・StringNumericLiteral の MV ::: - StrUnsignedDecimalLiteral は StrUnsignedDecimalLiteral の MV (注釈としては、StrUnsignedDecimalLiteralのMVが0である場合、このMVの負数もまた0。以下で説明する丸め(処理)規則は、この符号なしの数学的なゼロの適切な値として浮動小数点 +0 や -0 への変換を操作。) * StringNumericLiteral / 文字列数値リテラル
・StrUnsignedDecimalLiteral の MV ::: Infinity(無限)は10の10000乗(値が大きすぎる為、おそらくそれは+∞に丸められる。) ・StrUnsignedDecimalLiteral の MV ::: DecimalDigits. は DecimalDigits の MV ・StrUnsignedDecimalLiteral の MV ::: DecimalDigits . DecimalDigits は、 n が2つめのDecimalDigitsにある文字数であり、(2つめのDecimalDigitsの MVは10のマイナスn乗倍)を加えた1つめのDecimalDigitsの MV ・StrUnsignedDecimalLiteral の MV ::: DecimalDigits. ExponentPart は、eがExponentPartのMVでDecimalDigits掛ける10e倍の MV ・StrUnsignedDecimalLiteral の MV ::: DecimalDigits. DecimalDigits ExponentPart は、2つめのDecimalDigitsにある文字数、eはExponentPartのMVであり、((2つめのDecimalDigits掛ける10マイナスn乗倍のMV)を加えた1つめのDecimalDigitsのMVで)10e倍 ・StrUnsignedDecimalLiteral の MV ::: . DecimalDigits は、10のマイナスn乗倍のMVであり、n はDecimalDigitsにある文字数 ・StrUnsignedDecimalLiteral の MV ::: . DecimalDigits ExponentPart は、10のe-n乗倍のMVであり、n は、DecimalDigitsにある文字数であり、eはExponentPartのMV ・StrUnsignedDecimalLiteral の MV ::: DecimalDigits は、DecimalDigitsのMV ・StrUnsignedDecimalLiteral の MV ::: DecimalDigits ExponentPart は、DecimalDigits掛ける10のe乗倍のMVであり、eは、ExponentPartのMV * StrUnsignedDecimalLiteral / 文字列符号なし10進リテラル
・DecimalDigits の MV ::: DecimalDigitはDecimalDigitのMV ・DecimalDigits の MV ::: DecimalDigits DecimalDigit は、DecimalDigitのMVを加えたもの(DecimalDigits掛ける10のMV) * DecimalDigits / 10進数・10進数値の並び
・ExponentPart の MV ::: ExponentIndicator SignedInteger は、SignedIntegerのMV * ExponentPart / 指数部
・SignedInteger の MV ::: DecimalDigits は、DecimalDigitsのMV ・SignedInteger の MV ::: + DecimalDigits は、DecimalDigitsのMV ・SignedInteger の MV ::: - DecimalDigits は、DecimalDigitsのMVの負の値 * SignedInteger / 符号付き整数
・DecimalDigit の MV ::: 0や16進数の0 ::: 0 は 0 ・DecimalDigit の MV ::: 1や16進数の1 ::: 1 は 1 ・DecimalDigit の MV ::: 2や16進数の2 ::: 2 は 2 ・DecimalDigit の MV ::: 3や16進数の3 ::: 3 は 3 ・DecimalDigit の MV ::: 4や16進数の4 ::: 4 は 4 ・DecimalDigit の MV ::: 5や16進数の5 ::: 5 は 5 ・DecimalDigit の MV ::: 6や16進数の6 ::: 6 は 6 ・DecimalDigit の MV ::: 7や16進数の7 ::: 7 は 7 ・DecimalDigit の MV ::: 8や16進数の8 ::: 8 は 8 ・DecimalDigit の MV ::: 9や16進数の9 ::: 9 は 9 ・DecimalDigit の MV ::: aや16進数のa ::: A は 10 ・DecimalDigit の MV ::: bや16進数のb ::: B は 11 ・DecimalDigit の MV ::: cや16進数のc ::: C は 12 ・DecimalDigit の MV ::: dや16進数のd ::: D は 13 ・DecimalDigit の MV ::: eや16進数のe ::: E は 14 ・DecimalDigit の MV ::: fや16進数のf ::: F は 15 * DecimalDigit / 単一の10進数・10進数値
・HexIntegerLiteral の MV ::: 0x HexDigit は、HexDigitのMV ・HexIntegerLiteral の MV ::: 0x HexDigit は、HexDigitのMV ・HexIntegerLiteral の MV ::: HexIntegerLiteral HexDigit は、HexDigitのMVを加えたもの(HexIntegerLiteral掛ける16のMV) * HexIntegerLiteral / 16進整数リテラル
一度、String数値リテラルにおける正確なMVが決定されるとNumber型の値に丸められます。 MVが0である場合、丸められた値が-0というケースにおけるString数値リテラルにある最初の非ホワイトスペース文字が'-'(マイナス)でない限り、丸められた値は+0です。 それ以外の場合には、StrUnsignedDecimalLiteralと桁0を伴う20番め以降の有効な桁ごとに置換することによって、そしてその際に20番めの桁位置でリテラルを増分することによって生成した桁0を伴う20番め以降の有効な桁、または、リテラルのMVにおけるNumber値ごとに置換することによって生成したリテラルのMVにおけるNumber値の何れかになる場合があるNumber値というケースにおける必要な桁数が20桁以上であるリテラルでない限り、丸めた値は(8.5で定義された意味合いで)MVにおけるNumber値にしなければいけません。 ExponentPartの一部でない場合で且つ、
には、桁は有効です。
抽象操作ToIntegerは、その引数を整数の値に変換します。 この抽象操作は、次のように機能します。
1.numberは入力となる引数についてToNumberを呼んだ結果とする 2.numberがNaNである場合には、+0を返す 3.numberが+0、-0、+∞、-∞である場合には、numberを返す 4.sign(number) * floor(abs(number)) の算出値を結果として返す
抽象操作ToInt32は、その引数を-2の31乗から2の31乗-1の範囲を含むそこにある2の32乗の1つである整数値に変換します。 この抽象操作は、次のように機能します。
1.numberは、入力となる引数についてToNumberを呼ぶことによって結果とする 2.numberがNaN、+0、-0、+∞、-∞である場合には、+0を返す 3.posIntは、sign(number) * floor(abs(number)) とする 4.int32bitは、posInt法として2の32乗とする、それは、正の符号を伴うNumber型である有限の整数値 k であり、且つ、数学的にposIntのものとは異なったり、数学的に2の32乗の複数の整数である k といったようなサイズにある2の32乗よりも小さいという意味 5.int32bitが2の31乗以上である場合には、int32bit-2の32乗を返し、そうでなければint32bitを返す
[注釈] ToInt32:の上記定義について追記
[注記]冪等(idempotent):「べきとう」の「とう」は、「など」という意味合いではなく「等しい」ことを表し、数学的には、ある1つの数値が表す値とその数値に同じ数値を複数回、累乗・べき乗(同じ数同士の乗算)した時の結果が等しい場合、「そのべき乗した際の演算子は、冪等である」とされ、その性質や規則性を冪等性(idempotence)、冪等律(Idempotent law)などといい、プログラミングを含む情報工学では、転じて「同じ条件下で1回の実行によって得られた結果は、複数回実行したとしても毎回全く同じ結果を得られる」ことを表す。
抽象操作ToUint32は、その引数を0から2の32乗-1までの範囲を含むその中にある2の32乗の整数値の1つに変換します。 この抽象操作は、次のように機能します。
1.numberは、入力となる引数についてToNumberを呼ぶことによって結果とする 2.numberがNaN、+0、-0、+∞、-∞である場合には、+0を返す 3.posIntは、sign(number) * floor(abs(number)) とする 4.int32bitは、posInt法として2の32乗とする、それは、正の符号を伴うNumber型の有限の整数値 k と数学的にはposIntとは異なり、数学的に2の32乗の複数の整数である k といったようなサイズにある2の32乗より小さいという意味 5.int32bitを返す
[注釈] ToUInt32:の上記定義について追記
抽象操作ToUint16は、その引数を0から2の16乗-1を含む範囲にある2の16乗の整数値に変換します。 この抽象操作は、次のように機能します、
1.numberは、入力となる引数についてToNumberを呼ぶことによって結果とする 2.numberがNaN、+0、-0、+∞、-∞である場合には、+0を返す 3.posIntは、sign(number) * floor(abs(number)) とする 4.int16bitはposInt法として2の16乗とする、それは正の符号を伴い、数学的にはposIntとは異なり、2の16乗の複数の整数値である k といったような大きさの中にある2の16乗よりも小さいNumber型の有限の整数値 k という意味。 5.int16bitを返す
[注釈] ToUint16の上記定義について追記
抽象操作ToStringは、その引数をTable 13によってString型の値に変換します。
Table 13 -- ToString変換 -------------------------------------------------------------------------------- 引数の型 結果 -------------------------------------------------------------------------------- Undefined "undefined" Null "null" Boolean その引数が true である場合には、その結果は、 "true" その引数が false である場合には、その結果は、 "false" Number 9.8.1 参照 String 入力となる引数を返す(変換なし) Object 次のステップを適用 1. primValueは、ToPrimitive(input argument, hint String) とする 2. ToString(primValue) を返す --------------------------------------------------------------------------------
抽象操作ToStringは、次のようにStringの書式にNumber m を変換します。
1.もし、 m が NaN である場合には、Stringの"NaN"を返す 2.もし、 m が +0 や -0 である場合には、Stringの"0"を返す 3.もし、 m が ゼロより小さい場合には、Stringの"-"とToString(-m)の結合であるStringを返す 4.もし、 m が 無限大である場合には、Stringの"Infinity"を返す 5.それ以外の場合には、n,k,sは、k≧1,10のk乗-1≦s<10のk乗、s*10のn-k乗におけるNumber型の値であるm、また k は可能な限り小さいといったような整数にする
注釈として k は、s を表示する為の少数の桁の数であり、それは10で割り切れず、sの最下位桁が、これらの条件によって一意に決まる必要はありません。
6.もし、 k ≦ n ≦ 21 である場合には、(先行するゼロがない為、) s の小数表示部 k 桁から成るStringを返し、文字'0'として現れるn-kによって続く 7.もし、0 < n ≦ 21 である場合には、s の小数表示の最も重要なn桁から成るStringを返し、小数点'.'によって続き、残りの s の小数表示部の k-n 桁まで続く 8.もし、-6 < n ≦ 0 である場合には、文字'0'から成るStringを返し、小数点'.'によって続き、文字'0'として現れる-nによって続き、s の小数表示部の k 桁によって続く 9.それ以外の場合には、もし、 k = 1 である場合には、s の単独の桁から成るStringを返し、小文字 'e' によって続き、n-1 が正か負かにより1つのプラス記号 '+' やマイナス記号 '-' によって続き、先行するゼロのない整数 abs(n-1) の小数表示部によって続く 10. s の小数表示部の最も重要な桁から成るStringを返し、小数点 '.' によって続き、残る s の小数表示部 k-1 によって続き、小文字 'e' によって続き、n-1 が正か負かにより1つのプラス記号 '+' やマイナス記号 '-' によって続き、先行するゼロのない整数 abs(n-1) の小数表示部によって続く
[注釈1] 次の観測は、実装におけるガイドラインとして便利になる場合もありますが、この標準規格の正規の要件の一部ではありません。
[注釈2] 上記ルールによって要求される以上により正確な変換を提供する実装においては、ステップ5の次の代替バージョンをガイドラインとして使うことが推奨されます。 それ以外の場合には、n,k,sは、k ≧ 1、10のk-1乗 ≦ s < 10のk乗、 s * 10のn-k乗 におけるNumber型の値が m であり、 k は可能な限り小さくなります。 もし、s について複数の可能性がある場合、mにおける値の中で最も近い値である s * 10のn-k乗 におけるsの値を選択します。 もし、s の値としてそのような可能性が2つある場合には、偶数の方を選択します。 付記として s の小数表示部にある桁の数 k と そのs自体は、10で割り切れません。 [注釈3] ECMAScriptの実装は、David M 氏によって書かれた有用な紙面とコードが見つかる場合があります。
『Gay for binary-to-decimal conversion of floating-point numbers (浮動小数点数のバイナリから小数への変換における華) / Gay, David M.』 『Correctly Rounded Binary-Decimal and Decimal-Binary Conversions (正しい丸め処理のBinary-DecimalとDecimal-Binary変換)』 『Numerical Analysis, Manuscript 90-10 (数値解析、原稿90-10) 』 AT&T Bell Laboratories/AT&Tベル研究所 (Murray Hill, New Jersey) 1990年11月30日 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は、その引数をTable 14によってObject型の値に変換します。
Table 14 -- ToObject ------------------------------------------------------------------------------------------------------------- 引数の型 結果 ------------------------------------------------------------------------------------------------------------- Undefined TypeError例外を投げる(スローする) Null TypeError例外を投げる(スローする) Boolean [[PrimitiveValue]]内部プロパティが引数の値に設定される新たなBooleanオブジェクトを生成。Booleanオブジェクトの概要については15.6参照。 Number [[PrimitiveValue]]内部プロパティが引数の値に設定される新たなNumberオブジェクトを生成。Numberオブジェクトの概要については15.7参照。 String [[PrimitiveValue]]内部プロパティが引数の値に設定される新たなStringオブジェクトを生成。Stringオブジェクトの概要については15.5参照。 Object 結果は入力となる引数(変換なし) -------------------------------------------------------------------------------------------------------------
抽象操作CheckObjectCoercibleは、その引数が、ToObjectを利用してObjectに変換されることができない値である場合、エラーを投げます。 これについてはTable 15によって定義されます。
Table 15 -- CheckObjectCoercible の結果 --------------------------------------------------- 引数の型 結果 --------------------------------------------------- Undefined TypeError例外を投げる(スローする) Null TypeError例外を投げる(スローする) Boolean リターン Number リターン String リターン Object リターン ---------------------------------------------------
抽象操作IsCallableは、その引数がTable 16による関数のObjectを呼ぶことになるECMAScript言語の値にしなければいけない場合に決定されます。
Table 16 -- IsCallable の結果 ------------------------------------------------------------------------------------------------------------- 引数の型 結果 ------------------------------------------------------------------------------------------------------------- Undefined falseを返す Null falseを返す Boolean falseを返す Number falseを返す String falseを返す Object 引数が[[Call]]内部メソッドを持つ場合にはtrue、そうでない場合にはfalseを返す -------------------------------------------------------------------------------------------------------------
ECMAScript言語の値である x と y である場合の内部比較抽象操作SameValue(x, y)は、trueまたはfalseを生成します。 このような比較は次のように実行されます。
1.Type(x)がType(y)と異なる場合、falseを返す 2.Type(x)がUndefinedである場合、trueを返す 3.Type(x)がNullである場合、trueを返す 4.Type(x)がNumberである場合、 a. x が NaN かつ y が NaNである場合、trueを返す b. x が +0 かつ y が -0である場合、falseを返す c. x が -0 かつ y が +0である場合、falseを返す d. x が y と同じNumber型の値である場合、trueを返す e.(何れでもない場合)falseを返す 5.Type(x)がString型である場合、x と y の文字並びが全く同じ(一致する位置において同じ長さで同じ文字)であればtrueを返し、それ以外は、falseを返す 6.Type(x)がBooleanである場合、x と y が共にtrueまたはfalseであればtrueを返し、それ以外は、falseを返す 7.x と y が同じオブジェクトを参照する場合、trueを返す。それ以外はfalseを返す。