第 5 第 ECMA-262 Edition5.1 第第第 第 9 第 第第第第第第第 hebikuzure aka 第第 第 This material provided by CC BY-NC-ND 4.0. See http://creativecommons.org/licenses/by-nc-nd/4.0/
Jun 30, 2015
第 5 回 ECMA-262 Edition5.1 読書会
第 9 条 型変換とテストhebikuzure aka 村地 彰
This material provided by CC BY-NC-ND 4.0. See http://creativecommons.org/licenses/by-nc-nd/4.0/
About me 村地 彰 aka hebikuzure 株式会社シーピーエス
http://www.murachi.net/ http://www.hebikuzure.com/ Microsoft MVP (Internet Explorer) Apr. 2011 ~
2014/8/27 2© 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会
型変換 ECMAScript ランタイムは必要に応じて自動的に型変換を実行する どんな時に型変換されるのか ⇒演算の実行時に行われる そのため型変換の抽象操作を明確にしておく必要がある
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 3
抽象操作? 言語の内部的な動作 必要な時に勝手に実行される コードから明示的に実行できない という理解で OK ⇒竹迫先生?
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 4
要注意事項 抽象操作はポリモーフィック つまりどの抽象操作も、 ECMAScript のすべての型のデータを入力とし得る ので、この先の定義が長い orz
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 5
ToPrimitive 入力が Object 型以外の場合 ⇒何もしない ( 無変換 )
入力が Object 型の場合 ⇒ Object の [[DefaultValue]] 内部メソッド を呼び出してその戻り値に変換する
[[DefaultValue]] メソッド ⇒ 8.12.8 で定義されている
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 6
ToBooleanUndefined false
Null false
Boolean 無変換
Number +0, -0, NaN は falseそれ以外は true
String 空文字列 ( 長さが 0) は falseそれ以外は true
Object true
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 7
ToNumberUndefined NaNNull +0Boolean true は 1 、 false は +0Number 無変換
String 数値に変換できないものは NaN
ObjectToPrimitive を実行して primValue とし、 ToNumber(primValue) の結果を返す
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 8
文字列の数値への変換 文字列が数値に変換可能か確認
◦ StringNumericLiteral に相当するかチェック
変換可能なら MV (mathematical value) を決定する◦ 変換不可の場合は NaN
MV を Number 型の値に丸める
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 9
数値として扱える文字列と数値リテラル の違い StringNumericLiteral
◦ 先頭や末尾に white space や改行を含んでよい◦ 先頭に一つまたは複数の 0 が付いていても良い◦ 先頭に符号 +, - が付いていても良い◦ 空文字列と white space のみの文字列は +0 に変換
NumericLiteral◦ white space や改行、先頭の 0 や符号は NG
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 10
例StringNumericLiteral NumericLiteral
123456 〇 〇
+123456 〇 ×
15.25 〇 〇
00123 〇 ×
123 ( 先頭空白 )
〇 ×
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 11
ToInteger ToNumber を実行 結果 (number) が NaN なら +0 を返す +0, -0, +∞, -∞ の場合はそのままの値 それ以外の場合は sign(number) × floor(abs(number)) を返す
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 12
ToInt32 ToNumber を実行 その結果 (number) が NaN, +0, -0, +∞, -∞ の場合はなら +0 を返す number を符号付 32 ビット整数の範囲に割り当てる(−2,147,483,648 から 2,147,483,647)
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 13
ToUint32 ToNumber を実行 その結果 (number) が NaN, +0, -0, +∞, -∞ の場合はなら +0 を返す number を符号なし 32 ビット整数の範囲に割り当てる(0 から 4,294,967,295)
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 14
ToUint16 ToNumber を実行 その結果 (number) が NaN, +0, -0, +∞, -∞ の場合はなら +0 を返す number を符号なし 16 ビット整数の範囲に割り当てる(0 から 65,535)
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 15
ToStringUndefined "undefinded"Null "null"
Boolean ture なら "true" 、false なら "false"
Number 数値を一定の規則で文字列に変換
String 無変換
Object ToPrimitive hint String した結果を ToString
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 16
数値の文字列への変換 NaN なら "NaN" +0 または -0 なら "0" 負数であれば、符号を反転してから文字列に変換して先頭に "-" を付ける 無限大なら "Infinity" それ以外は数値を文字列に変換
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 17
変換ルール 以下の条件の整数 k, s, n を求める
◦ k =< 1◦ 10^k-1 =< s < 10^k◦ s * 10^n-k の値が元の数値 m と等しい◦ k ができるだけ小さい
k は m の末尾の 0 を除いた桁数 これを元に変換
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 18
例 1 m = 12345678 = 12345678 * 10^0◦s = 12345678◦10^7 =< s < 10^8 なので k = 8◦n = k + 0 = 8◦"12345678"
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 19
例 2 m = 1234567800 = 12345678 * 10^2◦s = 12345678◦10^7 =< s < 10^8 なので k = 8◦n = k + 2 = 10◦"1234567800"
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 20
例 3 m = 1.23 = 123 * 10^-2◦s = 123◦10^2 =< s < 10^3 なので k = 3◦n = k + (-2) = 1◦"1.23"
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 21
例 4 m = 0.012 = 12 * 10^-3◦s = 12◦10^1 =< s < 10^2 なので k = 2◦n = k + (-3) = -1◦"0.012"
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 22
桁数の上限 小数部 6 桁以上、整数部 22 桁以上は指数表現の文字列 ex. "1.2e24"
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 23
ToObjectUndefined TypeError 発生Null TypeError 発生
Boolean [[PrimitiveValue]] 内部プロパティを引数にして新規 Boolean オブジェクトを作成
Number [[PrimitiveValue]] 内部プロパティを引数にして新規 Number オブジェクトを作成
String[[PrimitiveValue]] 内部プロパティを引数にして新規 String オブジェクトを作成
Object 無変換2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 24
CheckObjectCoercible ToObject で Object 型に変換できるかテストする
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 25
Undefined TypeError 発生Null TypeError 発生Boolean 無変換Number 無変換String 無変換Object 無変換
IsCallable 関数として実行可能かテストする
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 26
Undefined falseNull falseBoolean falseNumber falseString falseObject [[Call]] があれば true
それ以外は false
同値アルゴリズム 抽象操作 SameValue(x, y) で x と y が同値か判定する
◦ x と y の型が異なると false◦ x が undedined なら true◦ x が null なら true◦ x が Number の場合
◦ x が NaN で y も NaN なら true◦ x が +0 で y が -0 なら false◦ x が -0 で y が +0 なら false◦ x と y が同じ Number 値なら true◦ それ以外は false
◦ x が String の場合、 x と y が完全に同じ文字のシーケンスなら true 、そうでなければ false
◦ x が Boolean の場合、 x と y が共に true か、共に false の場合は true 、そうでなければ false
◦ x と y が同じオブジェクトを参照している場合 true 、そうでなければ false2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 27