hylom'sWeblog

- hylom's blog
| about hylom / hylom.net | old contents | login

ECMAScript 2015の仕様書を読む(その11)

posted on 2016/04/21 23:59:27

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回はNumber、Math、Dateオブジェクトについて解説する第20章のうち、Mathオブジェクトについて。

第20章第2節

 Mathオブジェクトについて。Mathオブジェクトは関数オブジェクトではないため、関数としてもnewキーワード付きでも実行できない。

 Mathオブジェクトは多数のプロパティ/メソッドを持つ。まず、数値演算で使われる次のような定数が定義されている。これらはすべて書き込み禁止で列挙もされない。また、Math[@@toStringTag]のみConofigurableである。

Math.E	ネイピア数(e、exp(1))
Math.LN10	log(10)
Math.LN2	log(2)
Math.LOG10E	log10(e)
Math.LOG2E	log2(e)
Math.PI	円周率
Math.SQRT1_2	√(1/2)
Math.Math.SQRT2	√2
Math[@@toStringTag]	"Math"という文字列

 また、次のような数学関数をメソッドとして持つ。

Math.abs(x)	絶対値
Math.acos(x)	アークコサイン
Math.acosh(x)	逆双曲線コサイン
Math.asin(x)	アークサイン
Math.asinh(x)	逆双曲線サイン
Math.atan(x)    アークタンジェント
Math.atanh(x)   逆双曲線タンジェント
Math.atan2(x, y)	atan(y/x)
Math.cbrt(x)	立方根
Math.ceil(x)    x以上の最小の整数
Math.clz32(x)	xを2進数表示し、その戦闘から続く0の桁数
Math.cos(x)	コサイン
Math.cosh(x)	双曲線コサイン
Math.exp(x)	eのx乗
Math.expm1(x)	eのx乗 - 1
Math.floor(x)	x以下の最小の整数
Math.fround(x)	xに最も近い32ビット浮動小数点数を返す
Math.hypot(value1, value2, value3, ...values)	引数で与えた値の2乗和平方根を返す
Math.imul(x, y)	xとyを整数に変換したものの積を返す
Math.log(x)	eを底とするxの対数
Math.log1p(x)	log(x) + 1
Math.log10(x)	10を底とするxの対数
Math.log2(x)	2を底とする2の対数
Math.max(value1, value2, value3, ...values)	引数の中で最大の数を返す。引数が与えられなかった場合は-Infinityを、NaNが含まれていた場合はNaNを返す
Math.min(value1, value2, value3, ...values)	引数の中で最小の数を返す。引数が与えられなかった場合は-Infinityを、NaNが含まれていた場合はNaNを返す
Math.pow(x, y)	xのy乗を返す
Math.random()	0以上1以下の乱数を返す
Math.round(x)	xに最も近い整数を返す(xの小数点1桁目を四捨五入する)
Math.sign(x)	xが0より大きければ1、0なら0、0より小さければ-1を返す
Math.sin(x)	サイン
Math.sinh(x)	双曲線サイン
Math.sqrt(x)	平方根
Math.tan(x)	タンジェント
Math.tanh(x)	双曲線タンジェント
Math.trunc(x)	xの整数部分を返す

ECMAScript 2015の仕様書を読む(その10)

posted on 2016/04/20 00:17:00

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回はNumber、Math、Dateオブジェクトについて解説する第20章のうち、Numberオブジェクトについて。

第20章第1節

 Numberオブジェクトについて。Numberオブジェクトは基本型であるNumberに対応するオブジェクト。サブクラスを作って拡張可能となっている。サブクラスを作る場合、コンストラクタ内でsuperキーワードを使ってNumberオブジェクトのコンストラクタを実行することが推奨されている。

 Numberオブジェクトを関数として実行すると、引数を数値化したものを返す。引数が与えられなかった場合は0を返す。また、newキーワード付きで実行されると引数を数値化したものを値として格納する新たなNumberオブジェクトを作成して返す。なお、このコンストラクタは内部オブジェクトを参照している。

 Numberオブジェクトが持つプロパティやメソッドは下記の通り。

Number.EPSILON	「1と1より大きい最小の数の差」を示す定数
Number.isFinite(number)	numberがNaN、Infinity、-Infinity以外の数であればtrueを返す
Number.isInteger(number)	numberが整数であればtrueを返す
Number.isNaN(number)	numberがNaNであればtrueを返す
Number.isSafeInteger(number)	numberが整数で、かつその絶対値がNumber.MAX_SAFE_INTEGER以下であればtrueを返す
Number.MAX_SAFE_INTEGER	2の53乗-1。Number型では整数はこの数+1までしか表現できない
Number.MAX_VALUE	Number形で扱える最大の数。約1.7976931348623157×10の308乗
Number.MIN_SAFE_INTEGER	-(2の53乗-1)。Number型では整数はこの数-1までしか表現できない
Number.MIN_VALUE	Number形で扱える最小の数。約5×10の-324乗
Number.NaN	NaN	
Number.NEGATIVE_INFINITY	-Infinity
Number.paseFloat(string)	parseFloat(string)と同等
Number.parseInt(string, radix)	parseFloat(string, radix)と同等
Number.POSITIVE_INFINITY	Infinity
Number.prototype	初期値は内部オブジェクト

 なお、Number.isNaNはisNaNとは異なり、引数としてNaNが与えられた場合のみtrueを返す。

> isNaN("fo")
true
> Number.isNaN("fo")
false

 また、Number.MAX_SAFE_INTEGER+1を超える整数、もしくはNumber.MIN_SAFE_INTEGER-1よりも小さい整数は次の例のように演算結果が保証されない。

> Number.MAX_SAFE_INTEGER 
9007199254740991
> Number.MAX_SAFE_INTEGER + 1
9007199254740992
> Number.MAX_SAFE_INTEGER + 2
9007199254740992
> Number.MAX_SAFE_INTEGER + 3
9007199254740994

 Number.prototypeの持つプロパティ/メソッドは下記になる。

Number.prototype.constructor	コンストラクタ。初期値は内部オブジェクト
Number.prototype.toExponential(fractionDigits)	指数表記した文字列に変換して返す。このとき、小数点以下はfractionDigitsで指定した桁数となる
Number.prototype.toFixed(fractionDigits)	固定小数点表記した文字列に変換して返す。このとき、小数点以下はfractionDigitsで指定した桁数となる
Number.prototype.toLocaleString([reserved1 [, reserved2]])	ECMA-402規格で定義されたローカリゼーションされた文字列を返す
Number.prototype.toPrecision(precision)	precisionで指定した桁数の文字列に変換して返す
Number.prototype.toString([radix])	文字列に変換して返す。radixが指定された場合、radix進数表記で返す
Number.prototype.valueOf()	値を返す

ECMAScript 2015の仕様書を読む(その9)

posted on 2016/04/15 01:06:06

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は基本オブジェクト(Fundamental Objects)についての第19章のうち、Boolean、Symbol、Errorオブジェクトについて。

第19章第3節

 Booleanオブジェクトおよびそのメソッド、プロパティについて説明されている。

 Booleanオブジェクトは関数として実行すると、引数として与えたオブジェクトの真偽値に対応したtrueもしくはfalseを返す。また、newキーワード付きで実行するとその真偽値に対応したBooleanオブジェクトを返す。

 Booleanオブジェクトはprototypeプロパティのみを持つ。初期値は内部オブジェクトとなる。このプロパティの書き換えや属性変更は行えない。また、Boolean.prototypeは下記のプロパティ/メソッドを持つ。

Boolean.prototype.constructor	コンストラクタ。初期値は内部オブジェクト
Boolean.prototype.toString()	格納されている値に応じて"true"もしくは"false"を返す
Boolean.prototype.valueOf()	格納されている値に応じてtrue/falseを返す

第19章第4節

 Symbolオブジェクトおよびそのメソッド、プロパティについて説明されている。SymbolはECMAScript2015で新たに導入された基本オブジェクトで、オブジェクトのプロパティを参照するためのキーとして使用することが想定されている。

 Symbolオブジェクトをそのまま関数として実行すると、ユニークなSymbolオブジェクトを作成して返す。このとき、作成されたオブジェクトの[[Description]]内部スロットに引数として与えたオブジェクトを文字列に変換したものが格納される。また、newキーワード付きで実行するとTypeError例外を発生させる。

 Symbolオブジェクトは下記のプロパティ/メソッドを持つ。

Symbol.for(key)	GlobalSymbolRegistryを検索し、keyに対応するSybolがあればそれを返す。無ければ、新たなSymbolを作成し、GlobalSymboその[[key]]内部スロットおよび[[symbol]]内部スロットにkeyを文字列に変換したものを設定する。GlobalSymbolRegistryにkeyをキーとしてこのSymbolを登録し、このSymbolを返す
Symbol.hasInstance	@@hasInstanceシンボルが格納されている
Symbol.isConcatSpreadable	@@isConcatSpreadableシンボルが格納されている
Symbol.iterator	@@iteratorシンボルが格納されている
Symbol.keyFor(sym)	GlobalSymbolRegistryを検索し、symシンボルに対応するkeyがあればそれを返す。なければundefinedを返す
Symbol.match	@@matchシンボルが格納されている
Symbol.prototype	初期値では内部オブジェクトが格納されている
Symbol.replace	@@replaceシンボルが格納されている
Symbol.search	@@searchシンボルが格納されている
Symbol.spicies	@@spiciesシンボルが格納されている
Symbol.split	@@splitシンボルが格納されている
Symbol.toPrimitive	@@toPrimitiveシンボルが格納されている
Symbol.toStringTag	@@toStringTagシンボルが格納されている
Symbol.unscopables	@@unscopablesシンボルが格納されている

 なお、GlobalSymbolRegistryはグローバルな内部変数。

 Symbol.prototypeは下記のプロパティ/メソッドを持つ。

Symbol.prototype.constructor	コンストラクタ。初期値は内部オブジェクト
Symbol.prototype.toString()	"Symbol ([[Description]])"という文字列を返す
Symbol.prototype.valueOf()	そのシンボル自体を返す。オブジェクトがSymbolオブジェクトで内場合、[[SymbolData]]内部スロットの値を返す
Symbol.prototype[@@toPrimitive](hint)	Symbolオブジェクトをプリミティブ値に変換したものを返す。hintは"default"もしくは"number"、"string"
Symbol.prototype[@@toStringTag]	初期値は"Symbol"

 [[SymbolData]]内部スロットは、そのSymbolオブジェクトの内容を示す値が格納されているもの。

第19章第5節

 Errorオブジェクトおよびそのメソッド、プロパティについて説明されている。Errorオブジェクトは例外が発生した際にランタイムによって生成されるほか、ユーザー定義例外の基本オブジェクトとしても使われる。

 Errorオブジェクトをそのまま関数として実行すると、新たなErrorオブジェクトを生成して返す。このとき、引数に与えたオブジェクトを文字列化してmeessageプロパティの値に設定する。また、newキーワード付きで実行した場合も同じ挙動を行う。

 なお、Errorオブジェクトのコンストラクタはそのサブクラスを作れるように設計されている。その場合、コンストラクタ内ではsuperキーワードを使ってErrorオブジェクトを作成・初期化することが推奨されている。

 Errorオブジェクトは下記のプロパティ/メソッドを持つ。

Error.prototype	初期値では内部オブジェクトが格納されている

 Error.prototypeは下記のプロパティ/メソッドを持つ。

Error.prototype.constructor	コンストラクタ。初期値は内部オブジェクト
Error.prototype.message	初期値は空の文字列
Error.prototype.name	初期値は"Error"
Error.prototype.toString()	"<name>: <message>"という文字列を返す

 なお、ECMAScript2015ではネイティブエラーオブジェクトとして下記が用意されている。

EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError

 これらのオブジェクトもサブクラス化が可能となっている。

ECMAScript 2015の仕様書を読む(その8)

posted on 2016/04/14 00:58:06

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は基本オブジェクト(Fundamental Objects)についての第19章のうち、Functionオブジェクトについて。

第19章第2節

 Functionオブジェクトおよびそのメソッド、プロパティについてが説明されている。

 Functionオブジェクトは関数として呼び出すことで、関数オブジェクトを返す。この場合、常にFunctionオブジェクトのコンストラクタとして関数は実行されるため、newキーワードを付けても付けなくても同じ結果となる。

 Functionオブジェクトを関数として実行する場合、以下のような引数を取る。

Function(p1, p2, ..., pn, body)

 p1〜pnはその関数に与える仮引数リスト、bodyは関数本体である。戻り値はFunctionオブジェクトとなる。なお、仮引数リストは文字列で与えられる。このとき、1つの引数に複数の仮引数を入れることが可能。たとえば以下の3つは同じものを返す。

new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

 Functionオブジェクトは以下のプロパティを持つ。

Function.length	1を返す
Funtion.prototype	内部オブジェクトが割り当てられている

 また、Function.protoypeオブジェクトは内部オブジェクトであるため、関数として実行すると常にundefinedを返す。また、下記のプロパティを持つ。

Function.prototype.apply(thisArg, argArray)	thisArgをthis変数に設定し、argArrayを引数として関数を実行する
Function.prototype.bind(thisArg, ...args)	thisArgをthis変数に設定し、argsを引数として呼び出される束縛関数を作成して返す
Function.prototype.call(thisArg, ...args)	thisArgをthis変数に設定し、argを引数として関数を実行する
Function.prototype.constructor	コンストラクタ関数。初期値は内部オブジェクト
Function.prototype.toString()	オブジェクトの内容を示す文字列を返す
Function.prototype[@@hasInstance](V)	v instanceof Fに相当

 なお、Functionオブジェクトのインスタンスはlength、name、prototypeというプロパティを持つ。lengthは関数の引数の数、nameは関数名が格納されている。

ECMAScript 2015の仕様書を読む(その7)

posted on 2016/04/13 01:26:05

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は基本オブジェクト(Fundamental Objects)についての第19章のうち、Objectオブジェクトについて。

第19章第1節

 ECMAScript 2015では基本オブジェクトとしてObject、Function、Boolean、Symbol、Errorの5つのオブジェクトが用意されている。どのオブジェクトも関数オブジェクトであり、コンストラクタとして呼び出すことができる。第1節では、Objectオブジェクトについて説明されている。

 Objectオブジェクトをnewキーワードを付けずに関数として呼び出すと、その引数をオブジェクト化したものを返す。たとえば数値を引数に与えた場合、その数値をNumberオブジェクトにしたものを返す。引数がnullやundefinedだった場合は新たに空のオブジェクトを作成して返す。また、newキーワード付きで呼び出すと、その引数で指定したオブジェクトのコンストラクタにその引数を与えて実行した結果を返す。たとえば、「new Object("hoge")」は「new String("hoge")」と同じ結果となる。

 Objectオブジェクトは次のメソッド/プロパティを持つ。

Object.assign(target, ...sources)	sourcesオブジェクトのenumerableなプロパティを、その添え字をキー、値を値としてtargetオブジェクトにコピーする。戻り値はtargetオブジェクト
Object.create (O[, Properties])	Oオブジェクトを元に新しいオブジェクトを作成する
Object.defineProperties(O, Properties)	Oオブジェクトにプロパティを追加する。そのプロパティがすでに定義されていた場合は指定されたものに更新する。Propertiesはキーとして対象のプロパティ、値としてそのプロパティの情報(ディスクリプタ)を格納したオブジェクトを持つオブジェクト
Object.defineProperty(O, P, Attributes)	OオブジェクトにPプロパティを追加する。Attributesはそのプロパティの情報を格納したオブジェクト(ディスクリプタ)
Object.freeze(O)	Oオブジェクトをフリーズする。フリーズされた(frozen)オブジェクトは変更ができなくなる
Object.getOwnPropertyDescriptor(O, P)	OオブジェクトのPプロパティのディスクリプタを返す
Object.getOwnPropertyNames(O)	Oオブジェクトのプロパティ名一覧を含む配列を返す
Object.getOwnProertySymbols(O)	Oオブジェクトのシンボル一覧を含む配列を返す
Object.getPrototypeOf(O)	Oオブジェクトのプロトタイプを返す
Object.is(value1, value2)	value1とvalue2が同じ値であればtrueを返す
Object.isExtensible(O)	Oオブジェクトが拡張可能であればtrueを返す
Object.isFrozen(O)	Oオブジェクトがフリーズされていればtrueを返す
Object.isSealed(O)	Oオブジェクトがsealed状態であればtrueを返す
Object.keys(O)	Oオブジェクトのプロパティ名一覧を含む配列を返す
Object.preventExtensions(O)	Oオブジェクトの拡張を禁止する。拡張が禁止されたオブジェクトには、新たなプロパティを追加できなくなる
Oject.prototype	オブジェクトのプロトタイプを格納するプロパティ
Object.seal(O)	Oオブジェクトをsealed状態にする。sealed状態のオブジェクトに対しては新たなプロパティを追加できず、またプロパティの設定を変更できなくなる
Object.setProtptypeOf(O, proto)	Oオブジェクトのプロトタイプをprotoオブジェクトに変更する

 オブジェクトのプロパティには「データプロパティ(Data Property)」と「アクセサプロパティ(Accessor Proerty)」がある。Dataプロパティは「Value」「Writable」「Enumerable」「Configurable」という属性を持つ。また、アクセサプロパティは「Get」「Set」「Enumerable」「Configurable」という属性を持つ(6.1.7.1)。これら属性を設定/変更するのがdefinePropertiesやdefineProperty。各属性の説明は下記の通り。

Value	そのプロパティに設定された値
Writable	プロパティへの値の書き込みが可能かどうか(Boolean)
Enumerable	そのプロパティがfor-inループでの列挙対象となるか(Boolean)
Configurable	そのプロパティの削除や属性変更が可能かどうか(Boolean)
Get	プロパティに対応するgetter関数
Set	プロパティに対応するsetter関数

 これらを以下のような形で格納したオブジェクトはプロパティディスクリプタと呼ばれる。

{
  value: 値,
  writable: (true|false),
  enumerable: (true|false),
  ...
}

 オブジェクトには拡張の不可や「frozen」や「sealed」といった「Ingegrity Level」を設定できる。まず拡張の不可だが、拡張が不可である場合オブジェクトに新しいプロパティを追加できなくなる(削除は可能)。また、sealed状態のオブジェクトは拡張不可となり、さらに各プロパティの属性が変更不可能になる(プロパティのconfigurable属性がfakseになる)。データプロパティの値を変更することは可能。いっぽうfrozen状態のオブジェクトは拡張不可で各プロパティの属性は変更できなくなる点はsealedと同じだが、さらにデータプロパティの値変更も不可となる(プロパティのwritable属性がfalseになる)。ただし、setter/getterについては実行可能。

 また、Object.prototypeオブジェクトは次のメソッド/プロパティを持つ。

Object.prototype.constructor	オブジェクトのコンストラクタ。デフォルトはObjectに相当する内部オブジェクト
Object.prototype.hasOwnProperty(V)	Vプロパティを持っていればtrue
Object.prototype.isPrototypeOf(V)	Vオブジェクトのプロトタイプがオブジェクトのプロトタイプと一致すればtrueを返す
Object.prototype.propertyIsEnumerable(V)	Vプロパティが列挙可能であればtrueを返す
Object.prototype.toLocaleString([reserved1[ , reserved2]])	オブジェクトのtoStringメソッドを実行しその結果を返す。現状Array、Number、Date、Typed Arraysのみが固有のtoLocaleStringを持つ
Object.prototype.toString()	オブジェクトが持つ情報を文字列に変換して返す
Object.prototype.valueOf()	オブジェクトのプリミティブ値を返す

ECMAScript 2015の仕様書を読む(その6)

posted on 2016/04/05 00:40:37

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。エラー処理および言語仕様の拡張についての第16章、標準組み込み(ビルトイン)オブジェクトについての第17章、グローバルオブジェクトについての第18章。

第16章

 エラー処理についてと言語仕様の拡張について。「early error」という種別のエラーが検出されたら、その時点でスクリプトの評価を止めてそれを通知する。また、モジュール内でのearly errorが検出されたら、その時点でモジュールの評価は中止されモジュールは初期化されない。evalキーワードでスクリプトが実行された際にearly errorが発生した場合、その評価をその時点で終了される。

 このearly errorの発生条件は仕様書内に細かく記載されているが、いわゆる文法エラーがこれに相当する。なお、ECMAScriptの処理系はSyntax ErrorおよびReferenceError以外のエラーについては詳細にそれをレポートするべきである。

 言語仕様の拡張については、16.1で拡張してはいけない仕様についてが説明されている。こちらについては一般的にコードを書く際には知識は不要なので割愛。

第17章

 ECMAScriptの標準ビルトインオブジェクトについて。

  • 標準ビルトインオブジェクトの多くは関数オブジェクト
  • 関数オブジェクトのうち、一部はnew演算子付きで実行することが想定されているコンストラクタ
  • ビルトイン関数には必要な引数よりも少ない引数を与えることができる。その場合、足りない引数にはundefinedが渡される
  • 必要な引数よりも多い引数を与えることもできる。通常それは関数の実行時に評価はされるが、その後は無視される。ただし、このとき実装側でTypeError例外を投げることも許可されている
  • ビルトイン関数オブジェクトはlengthプロパティを持つ。このプロパティには、その関数に与える最大の名前付き引数の数が格納されている

第18章

 グローバルオブジェクトについて。グローバルオブジェクトは、コード実行が開始される前に作成される。これらオブジェクトをnew演算子で作成することはできないし、関数として実行することもできない。ECMAScript 2015ではいくつかのグローバルオブジェクトが規定されているほか、処理系によって独自のグローバルオブジェクトを用意することも許されている。

 ECMAScript 2015で定義されているグローバルオブジェクトは次の通り。まず値を示すオブジェクトが3つ。

  • Infinity
  • NaN
  • undefined

 いくつかの関数オブジェクト。

  • eval(x)
  • isFinite(number)
  • isNaN(number)
  • parseFloat(string)
  • parseInt(string, radix)
  • decodeURI(encodedURI)
  • decodeURIComponent(encodedURIComponent)
  • encodeURI(uri)
  • encodeURIComponent(uriComponent)

 いくつかのグローバルオブジェクトのコンストラクタ。

  • Array()
  • ArrayBuffer()
  • Boolean()
  • DataView()
  • Date()
  • Error()
  • EvalError()
  • Float32Array()
  • Float64Array()
  • Function()
  • Int8Array
  • Int16Array
  • Int32Array
  • Map()
  • Number()
  • Object()
  • Proxy()
  • Promise()
  • RangeError()
  • ReferenceError()
  • RegExp()
  • Set()
  • String()
  • Symbol()
  • SyntaxError()
  • TypeRrror()
  • Uint8Array()
  • Uint8ClampedArray()
  • Uint16Array()
  • Uint32Array()
  • URIError()
  • WeakMap()
  • WeakSet()

 そのほかのグローバルオブジェクト。

  • JSON
  • Math
  • Reflect

 各オブジェクトについての詳細は後の章で説明されている。

ECMAScript 2015の仕様書を読む(その5)

posted on 2016/03/27 21:35:37

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回はモジュールの説明がある第15章。新機能であるモジュールのexport/importについて説明されている。

第15章

 スクリプトとモジュールについて。ESMAScript 2015では新たにモジュールという概念が投入されている。モジュールではexportやimport文を使ってモジュール外からアクセスできる要素を指定できる。

 import文では、ほかのモジュール内のメソッドやプロパティを現在のモジュール内で参照できるよう読み込むことができる。まず、下記のようにすると指定したモジュールがインポートされる。

import モジュール名

 また、次のようにしてモジュール内の指定した要素のみをインポートできる。

import 要素 from モジュール名
import * as 名前 from モジュール名
import {} from モジュール名
import {インポートする要素1 [, 要素2 [,...]]} from モジュール名
 from モジュール名

 要素の後に「as 名前」を続けることでインポートする要素を参照するための名前を指定できる。

 export文では、モジュールで公開する要素を指定できる。

export * from モジュール名;
export {要素1 [, 要素2, [,...]} from モジュール名;
export {要素1 名前[, 要素2, [,...]} from モジュール名;
export {要素1 [, 要素2, [,...]};
export 変数
export 宣言
export default 各種宣言

 要素の後に「as 名前」を続けることでエクスポートする要素を参照するための名前を指定できる。

 それぞれの挙動の違いは、15.2.1.16で説明されているが、次のような解釈になる。

import v from "mod";

 →modモジュールのdefaultオブジェクトをvという名前で参照可能にする

import * as ns from "mod";

 →modモジュールのオブジェクトをnsオブジェクト経由で参照可能にする

import {x} from "mod";

 →modモジュールのxオブジェクトをxという名前で参照可能にする

import {x as v} from "mod";

 →modモジュールのxオブジェクトをvという名前で参照可能にする

import "mod";

 →modモジュールを読み込むがいずれのオブジェクトも参照可能とはしない

export var v;

 →モジュールのvオブジェクトをvという名前で参照可能にする

export default function f() {};

 →モジュールの関数fをdefaultという名前で参照可能にする

export default function () {};
export default 42;

 →指定した関数や値をdefaultという名前で参照可能にする

export {x};

 →xオブジェクトをxという名前で参照可能にする

export {v as x};

 →vオブジェクトをxという名前で参照可能にする

export {x} from "mod";

 →指定したモジュールのxオブジェクトをxという名前で参照可能にする

export {v as x} from "mod";

 →指定したモジュールのvオブジェクトをxという名前で参照可能にする

export * from "mod";

 →指定したモジュールのすべてのオブジェクトを参照可能にする

ECMAScript 2015の仕様書を読む(その4)

posted on 2016/03/26 21:04:46

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は関数とクラスの解説がある第14章。ここではアロー関数やclassキーワード、関数のデフォルト値、可変長引数など多くの新機能が説明されている。

第14章

 関数とクラスについて。14.1では、以前よりあったfunctionキーワードを使った関数定義が説明されている。functionキーワードでの関数定義では、新たにRest Parameterという仕組みが導入された。これは、下記のように記述することで、可変長引数をより簡単に扱える仕組み。

function 関数名(引数1, 引数2, […,] ...残り引数)

 たとえば以下のようにすると、foo関数に与えた3つめ以上の引数は配列restに格納される。

function foo(arg1, arg2, ...rest) {}

 また、引数では新たにInitializerを使用できる。「引数=値」のように指定することで、その引数がundefinedだった場合、指定した値がセットされる。たとえば次の関数では、2つめの引数がundefinedだった場合、arg2には1が代入される。

function foo(arg1, arg2 = 1) {}

 14.2ではアロー(「=>」)を使った関数定義(アロー関数)が説明されている。アローを使った関数定義は、簡単にまとめると以下のようになる。

() => {関数定義}
(引数1) => {関数定義}
(引数1, 引数2, [...]) => {関数定義}
(引数1, 引数2, [...], ...rest) => {関数定義}

 {関数定義}の代わりに戻り値を直接記述することも可能。たとえば次の関数は、与えた引数の和を返す。

(a, b) => a + b

 なお、アロー関数内ではargumentsやsuper、this、new.targetが定義されず、関数を定義したレキシカル環境のそれぞれをそのまま継承する。

 14.3はメソッド定義についての説明。新たにget/setキーワードが導入されている。メソッド定義の際にメソッド名の前に「get」もしくは「set」を付与することで、getter/setterを定義できる。このメソッドに対しプロパティのように値を代入すると、代入した値を引数として定義したsetter関数が実行される。また、プロパティのように参照すると定義したgetter関数が実行され、その戻り値が返される。なお、getter関数には引数は与えられない。

 14.4は新たに実装されたgenerator関数についての説明。メソッド定義時の際にメソッド名の前に「*」を付与することで定義できる。generator関数では、yieldキーワードを使って関数の途中で実行を中断し、そ時点で指定した値を返すことが可能。yieldもしくはyield*キーワードで中断された関数を再度呼び出すと、その続きから実行が再開される。

 14.5ではclassキーワードなどを使ったクラス定義が説明されている。classキーワードもECMAScript2015の新機能。次のようなスタイルでクラスを定義できる。

class クラス名 [extends 継承するクラス名] {
  クラスの定義
}

 クラスの定義では、staticキーワードを使ったメソッドの定義が可能。

 14.6では末尾再帰の最適化についての説明。再帰的に実装されているコードをループに展開する流れに書いてある処理系による実装の話なので、JSコードを書く側としてはあまり意識する必要は無いはず。

ECMAScript 2015の仕様書を読む(その3)

posted on 2016/03/11 23:09:00

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は第12章と第13章。ここではひたすら定義が並んでいるので斜め読みして、必要に応じて戻ることにする。

第12章

 ECMAScriptの式について。deleteやvoid、typeof、instanceofなどを含む演算子の挙動についても解説されている。新キーワードであるyieldも登場。

 yieldはPythonのyieldと同様の処理を行うもので、関数の実行を中断して戻り値を返すというもの。その関数オブジェクトのnextメソッドを実行することで中断したところから実行を再開できる。

第13章

 文と宣言について。新しいキーワードであるletやconst、classなどが登場する。また、新たな構文であるfor〜of文も登場。

 letとconstはvarと同じく変数定義に使うキーワード。letはレキシカルスコープのみで通用する、いわゆる局所変数を定義するのに使い、constは定数として宣言するのに使う。

 また、新たにfor〜of文も登場している。for〜in文と似ているが、プロパティ名ではなくプロパティの値に対して反復処理を行う点が異なる。

ECMAScript 2015の仕様書を読む(その2)

posted on 2016/03/09 00:39:25

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回は第10章と第11章。第11章ではECMAScript 2015で追加されたテンプレートリテラルについての記述があるほか、細かいコード表記ルールが記載されているので目を通しておくと良い。

第10章

 ECMAScriptのソースコードについて。ソースコードはUnicodeで記述する。Unicodeではさまざまな符号化形式(UTF-8やUTF-16など)があるが、これについては規格では言及されていない。

 ECMAScriptコードが「use strict」ディレクティブで始まると、そのコードはStrictモードコードとして解釈される。また、モジュールコードやクラス宣言などもstrictモードのコードとなる。そのほか、一定の条件を満たすコードはstrictモードのコードとなる。それ以外のコードは非strictモードのコードとなる。

第11章

 ECMAScriptの文法について。

  • タブやVT、FF、スペースなどはすべてホワイトスペースとして扱われる。
  • CR、LF、LS、PSが改行として扱われる。CRとLFが続いた場合、単一の改行として扱われる。
  • コメントには複数行コメント(「/*」から「*/」で囲まれた部分)と単一行コメント(「//」から行末まで)がある
  • 「識別子」(変数名やメソッド名)は「ID_Start」プロパティを持つ任意のUnicode文字、「$」、「_」、「\」+Unicodeのエスケープシーケンスから始まる必要がある。また、利用できる文字は「ID_Continue」プロパティを持つ任意のUnicode文字と「$」、「_」、「\」+Unicodeのエスケープシーケンス、<ZWNJ>(ZERO WIDTH NON-JOINNER、U+200C)、<ZWJ>(ZERO WIDTH JOINNER、U+200D)。

 ECMAScriptには予約語があり、これらを識別子として使うことはできない。予約語一覧は以下のとおり。

break do in typeof
case else instanceof var
catch export new void
class extends return while
const finally super with
continue for switch yield
debugger function this
default if throw
delete import try

 また、次の2つは将来のための予約語(Future Reserved Words)とされており、こちらも利用できない。

enum await

 そのほか、strictモードでは下記も予約語とされている。

implements package protected
interface private public

 そのほか、「null」や「true」「false」も利用できない。

 数値リテラルについては、整数、小数、「e」や「E」を使った10のn乗表記、「0B」「0b」を使った二進数表記、「0o」「0O」を使った8進数表記、「0x」「0X」を使った16進数表記が可能。16進数表記では大文字/小文字の両方が利用可能。

 「"」もしくは「'」で囲んだ文字列は文字列リテラルとなる。どちらも改行を含むことはできない。また、「\」に続く文字はエスケープシーケンスとなる。複数行で記述したい場合、「\」+改行を使う。また、エスケープシーケンスとしては「\'」「\"」「\\」「\b」「\f」「\n」「\r」「\t」「\v」と「\<数値>」、「\x<16進数>」、「\uXXXX」、「\u{XXXX}」が利用できる(XXXXは16進数4文字)。

 「/<正規表現>/<フラグ>」という文字列は正規表現リテラルとなる。正規表現内では「\」、「/」、「[」は使えない。また、正規表現の1文字目に「*」は使えない。改行も使えない。これらを使いたい場合は代わりにエスケープシーケンスを使う。

 「`」で囲まれた文字列はテンプレートリテラルとなる。この機能はES6で新たに実装されたもの。文字列リテラルと異なり、改行を含むことが可能。このとき、CRLF(\r\n)やCR(\r)はLF(\n)に変換される。また、エスケープシーケンスのほか、「${」と「}」でコードを囲むことでその値を文字列に取り込むことができる。

 ECMAScript処理系は必要に応じて自動的にセミコロンを挿入する。自動セミコロン挿入には3つの基本ルールがある。これは積極的に使うべきではないので説明は割愛。