ecma 262 5th edition を読む #5 第9条

27
第 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/

Upload: -

Post on 30-Jun-2015

850 views

Category:

Technology


1 download

DESCRIPTION

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

TRANSCRIPT

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

第 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条

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条

型変換 ECMAScript ランタイムは必要に応じて自動的に型変換を実行する どんな時に型変換されるのか ⇒演算の実行時に行われる そのため型変換の抽象操作を明確にしておく必要がある

2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 3

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

抽象操作? 言語の内部的な動作 必要な時に勝手に実行される コードから明示的に実行できない という理解で OK ⇒竹迫先生?

2014/8/27 © 2014 Murachi Akira - CC BY-NC-ND - ECMA-262 Edition5.1 読書会 4

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

要注意事項 抽象操作はポリモーフィック つまりどの抽象操作も、 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条

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条

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条

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条

文字列の数値への変換 文字列が数値に変換可能か確認

◦ 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条

数値として扱える文字列と数値リテラル の違い 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条

例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条

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条

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条

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条

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条

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条

数値の文字列への変換 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条

変換ルール 以下の条件の整数 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条

例 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条

例 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条

例 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条

例 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条

桁数の上限 小数部 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条

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条

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条

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条

同値アルゴリズム 抽象操作 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