Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Ecma 262 5th Edition を読む #5 第9条

1,254 views

Published on

「Ecma 262 5th Edition を読む」 読書会 #5
第9条「型変換とテスト」のまとめです。

Published in: Technology
  • Be the first to comment

Ecma 262 5th Edition を読む #5 第9条

  1. 1. 第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/
  2. 2. About me 村地 彰 aka hebikuzure 株式会社シーピーエス http://www.murachi.net/ http://www.hebikuzure.com/ MicrosoftMVP(InternetExplorer)Apr.2011~ 2014/8/27 2© 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会
  3. 3. 型変換 ECMAScript ランタイムは必要に応じて 自動的に型変換を実行する どんな時に型変換されるのか ⇒演算の実行時に行われる そのため型変換の抽象操作を明確にして おく必要がある 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 3
  4. 4. 抽象操作? 言語の内部的な動作 必要な時に勝手に実行される コードから明示的に実行できない という理解でOK ⇒竹迫先生? 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 4
  5. 5. 要注意事項 抽象操作はポリモーフィック つまりどの抽象操作も、ECMAScript のす べての型のデータを入力とし得る ので、この先の定義が長いorz 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 5
  6. 6. ToPrimitive 入力が Object 型以外の場合 ⇒何もしない (無変換) 入力が Object 型の場合 ⇒Object の [[DefaultValue]] 内部メソッド を呼び出してその戻り値に変換する [[DefaultValue]] メソッド ⇒8.12.8 で定義されている 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 6
  7. 7. ToBoolean Undefined 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
  8. 8. ToNumber Undefined NaN Null +0 Boolean true は 1、false は +0 Number 無変換 String 数値に変換 できないものは NaN Object ToPrimitiveを実行して primValue とし、ToNumber(primValue) の結 果を返す 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 8
  9. 9. 文字列の数値への変換 文字列が数値に変換可能か確認 ◦ StringNumericLiteral に相当するかチェック 変換可能なら MV (mathematical value) を 決定する ◦ 変換不可の場合は NaN MV を Number 型の値に丸める 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 9
  10. 10. 数値として扱える文字列と 数値リテラル の違い 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
  11. 11. 例 StringNumericLiteral NumericLiteral 123456 〇 〇 +123456 〇 × 15.25 〇 〇 00123 〇 × 123 (先頭空白) 〇 × 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 11
  12. 12. 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
  13. 13. 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
  14. 14. 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
  15. 15. 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
  16. 16. ToString Undefined "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
  17. 17. 数値の文字列への変換 NaN なら "NaN" +0 または -0 なら "0" 負数であれば、符号を反転してから文字 列に変換して先頭に "-" を付ける 無限大なら "Infinity" それ以外は数値を文字列に変換 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 17
  18. 18. 変換ルール 以下の条件の整数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
  19. 19. 例 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
  20. 20. 例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
  21. 21. 例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
  22. 22. 例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
  23. 23. 桁数の上限 小数部6桁以上、整数部22桁以上は 指数表現の文字列 ex. "1.2e24" 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 23
  24. 24. ToObject Undefined 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
  25. 25. 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 無変換
  26. 26. IsCallable 関数として実行可能かテストする 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 26 Undefined false Null false Boolean false Number false String false Object [[Call]] があればtrue それ以外は false
  27. 27. 同値アルゴリズム 抽象操作 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、そうでなければ false 2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1読書会 27

×