ecma 262 5th edition を読む #5 第9条
DESCRIPTION
「Ecma 262 5th Edition を読む」 読書会 #5 第9条「型変換とテスト」のまとめです。TRANSCRIPT
![Page 1: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/1.jpg)
第 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/
![Page 2: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/2.jpg)
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読書会
![Page 3: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/3.jpg)
型変換 ECMAScript ランタイムは必要に応じて自動的に型変換を実行する どんな時に型変換されるのか ⇒演算の実行時に行われる そのため型変換の抽象操作を明確にしておく必要がある
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 3
![Page 4: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/4.jpg)
抽象操作? 言語の内部的な動作 必要な時に勝手に実行される コードから明示的に実行できない という理解で OK ⇒竹迫先生?
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 4
![Page 5: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/5.jpg)
要注意事項 抽象操作はポリモーフィック つまりどの抽象操作も、 ECMAScript のすべての型のデータを入力とし得る ので、この先の定義が長い orz
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 5
![Page 6: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/6.jpg)
ToPrimitive 入力が Object 型以外の場合 ⇒何もしない ( 無変換 )
入力が Object 型の場合 ⇒ Object の [[DefaultValue]] 内部メソッド を呼び出してその戻り値に変換する
[[DefaultValue]] メソッド ⇒ 8.12.8 で定義されている
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 6
![Page 7: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/7.jpg)
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
![Page 8: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/8.jpg)
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
![Page 9: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/9.jpg)
文字列の数値への変換 文字列が数値に変換可能か確認
◦ StringNumericLiteral に相当するかチェック
変換可能なら MV (mathematical value) を決定する◦ 変換不可の場合は NaN
MV を Number 型の値に丸める
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 9
![Page 10: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/10.jpg)
数値として扱える文字列と数値リテラル の違い 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
![Page 11: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/11.jpg)
例StringNumericLiteral NumericLiteral
123456 〇 〇
+123456 〇 ×
15.25 〇 〇
00123 〇 ×
123 ( 先頭空白 )
〇 ×
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 11
![Page 12: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/12.jpg)
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
![Page 13: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/13.jpg)
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
![Page 14: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/14.jpg)
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
![Page 15: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/15.jpg)
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
![Page 16: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/16.jpg)
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
![Page 17: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/17.jpg)
数値の文字列への変換 NaN なら "NaN" +0 または -0 なら "0" 負数であれば、符号を反転してから文字列に変換して先頭に "-" を付ける 無限大なら "Infinity" それ以外は数値を文字列に変換
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 17
![Page 18: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/18.jpg)
変換ルール 以下の条件の整数 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
![Page 19: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/19.jpg)
例 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
![Page 20: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/20.jpg)
例 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
![Page 21: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/21.jpg)
例 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
![Page 22: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/22.jpg)
例 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
![Page 23: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/23.jpg)
桁数の上限 小数部 6 桁以上、整数部 22 桁以上は指数表現の文字列 ex. "1.2e24"
2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 23
![Page 24: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/24.jpg)
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
![Page 25: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/25.jpg)
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 無変換
![Page 26: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/26.jpg)
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
![Page 27: Ecma 262 5th Edition を読む #5 第9条](https://reader036.vdocuments.pub/reader036/viewer/2022062514/55921fd41a28abda598b45e6/html5/thumbnails/27.jpg)
同値アルゴリズム 抽象操作 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