hylom'sWeblog

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

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

posted on 2016/05/11 00:42:56

 ECMAScript 2015の仕様書(ECMA-262)を読んでいます。今回はテキスト処理関連について規定する第21章のうち、Stringオブジェクトについて。

第21章1節

 Stringオブジェクトのコンストラクタは内部オブジェクトが割り当てられているが、サブクラス化可能になっており、Stringオブジェクトのサブクラスはコンストラクタ内でsuperキーワードを使ってStringコンストラクタを実行しインスタンスを作成しなければならない。

 なお、Stringオブジェクトを関数として実行すると引数を文字列に変換したものを返す。また、newキーワード付きで関数として実行すると、引数を値として格納したStringオブジェクトを返す。

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

String.fromCharCode(...codeUnits)	codeUnitsに相当する文字コードを含む文字列を返す。codeUnitsはUnicodeで指定。
String.fromCodePoint(...codePoints)	codePointsに相当する文字コードを含む文字列を返す
String.prototype	内部オブジェクトを指す。変更不可
String.raw(template, ...substitutions)	テンプレートオブジェクトに対し与えられた引数を使って展開を行う。通常はタグ付けされたテンプレート処理のために利用される

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

String.prototype.charAt(pos)	posの位置にある文字を返す
String.prototype.charCodeAt(pos)	posの位置にある文字の文字コードを返す
String.prototype.codePointAt(pos)	posの位置にある文字のコードポイントを返す
String.prototype.concat(...args)	argsを連結した文字列を返す
String.prototype.constructor	コンストラクタ。内部オブジェクト
String.prototype.endsWith(searchString [, endPosition])	文字列がsearchStringで終わっていればtrueを返す。endPositionを指定した場合、文字列がその長さであるかのように処理を行う
String.prototype.(includes)sesarchString [, position])	文字列がsearchStringを含んでいればtrueを返す。positionが指定された場合、その位置から検索を開始する
String.prototype.indexOf(searchString [, position])	文字列中でsearchStringが最初に出現する位置を返す。positionが指定された場合、その位置から検索を開始する
String.prototype.lastIndexOf(searchString [, position])	文字列中でsearchStringが最後に出現する位置を返す。positionが指定された場合、その位置から検索を開始する
String.prototype.localeCompare(tha [, reserved1 [, reserved2]])	ECMA-402で規定されているlocaleCompare処理を行う。
String.prototype.match(regexp)	regexpを使ってマッチ処理を行う
String.prototype.normalize([form])	文字列を正規化したものを返す。formは"NFC"、"NFD"、"NFKC"、"NFKD"が指定可能
String.prototype.repeat(count)	文字列をcount回繰り返したものを返す
String.prototype.replace(searchValue, replaceValue)	serachValueをreplaceValueに置き換える。replaceValueには$、$1、、
、$n、$nnなどが指定可能
String.prototype.search(regexp)	文字列中でregexpにマッチした位置を返す
String.prototype.slice(start, end)	startの位置からendの位置までの部分文字列を返す。endが負の場合、文字列のlengthにendを足したものがendとして使われる
String.prototype.split(separator, limit)	separatorで文字列を分割する
String.prototype.startsWith(searchString [, position])	文字列がsearchStringで始まっているならtrueを返す。positionが指定されていた場合、その場所から検索を開始する
String.prototype.substring(start, end)	startの位置からendの位置までの部分文字列を返す。endがstartより小さい場合、endとstartは入れ替えられる
String.prototype.toLocaleLowerCase([reseved1 [, reserved2]])	ECMA-402で規定されているtoLocaseLowerCase処理を行う。
String.prototype.toLocaleUpperCase([reseved1 [, reserved2]])	ECMA-402で規定されているtoLocaseUpperCase処理を行う。
String.prototype.toLowerCase()	小文字に変換した文字列を返す
String.prototype.toString()	変換した文字列を返す
String.prototype.toUpperCase()	大文字に変換した文字列を返す
String.prototype.trim()	前後のホワイトスペースをものを返す
String.prototype.valueOf()	変換した文字列を返す
String.prototype[@@iterator]()	文字列のコードポイントを走査するためのiteratorを返す

 また、Stringインスタンスはその文字列の長さを格納するlengthプロパティを持つ。

 Stringはiteratorを使った走査にも対応している。このiteratorは、文字列をインデックス順に返す。

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

posted on 2016/05/03 00:59:30

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

第20章3節

 ECMAScriptでは基準時刻(UTC1970年1月1日)からのミリ秒で時刻を表現する。表現できるのはこの基準時刻±9,007,199,254,740,992(2の53乗)ミリ秒であり、これはおよそ±28万5,616年に相当する。ただし、実際にDateオブジェクトで扱えるのは1970年1月1日正午から±1億日(±8,640,000,000,000,000ミリ秒)。

 なお、1日は8640万ミリ秒。また、閏秒は考慮されないが、閏年は考慮される。月については0〜11(0が1月)の値で表現されるが、日は1〜31の値で表現される。曜日は0〜6(0が日曜日)。そのほか、ECMAScript処理系はタイムゾーンの処理や夏時間なども考慮する。

 ECMAScriptはISO 8601 Extended Formatベースのフォーマット仕様(YYYY-MM-DDTHH:mm:ss.sssZ)をサポートする。なお、年については最大6桁(および±)での表現が可能。

 Dateオブジェクトは、基準時刻からのミリ秒をそのオブジェクトの値として格納する。また、Dateオブジェクトのコンストラクタは内部オブジェクトになっている。このコンストラクタはサブクラス化が可能だが、その場合superキーワードを使ってDataコンストラクタをコンストラクタ内で呼び出す必要がある。

 デフォルトのDateコンストラクタは3つのパターンがある。どの場合もnewキーワードなしで呼ばれた場合、いかなる引数が与えられていても現在時刻に相当する文字列を返す。

 2つ以上の引数を取るケースは以下。この場合、引数で指定した日付時刻に相当するDateオブジェクトを返す。また、引数にNaNがあると「不正な時刻」に相当するDateオブジェクトを返す。

Date(year, month [, date [, hours [, minutes [, seconds [, ms]]]]])

 1つの引数を与えた場合、引数として与えられたオブジェクトが日付時刻値を格納していた場合はその日付時刻に相当するDateオブジェクトを、もし引数が文字列であり、かつ日付時刻としてパースできる場合はその日付時刻に相当するDatetオブジェクトを、そうでない場合は引数を数値に変換し、基準時刻にその数値を足した日付時刻に相当するDateオブジェクトを返す。

 引数が与えられなかった場合、現在の日付時刻に相当するDateオブジェクトを返す。

 Dateオブジェクトは次のメソッドを持つ。

Date.now()	基準時刻から現在時刻までの経過ミリ秒を返す
Date.parse(string)	引数を文字列としてパースし、基準時刻からその時刻までの経過ミリ秒を返す

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

Date.prototype.constructor	コンストラクタ
Date.prototype.getDate()	そのオブジェクトの日にちを返す(下記、同様)
Date.prototype.getDay()	
Date.prototype.getFullYear()	
Date.prototype.getHours()	
Date.prototype.getMilliseconds()	
Date.prototype.getMinutes()	
Date.prototype.getMonth	
Date.prototype.getSeconds()	
Date.prototype.getTime()	基準時刻からの経過ミリ秒を返す
Date.prototype.getTimezoneOffset()	UTCからローカル時刻へのオフセット(分)を返す
Date.prototype.getUTCDate()	そのオブジェクトのUTCでの日にちを返す(下記、同様)
Date.prototype.getUTCDay()
Date.prototype.getUTCFullYear()
Date.prototype.getUTCHours()
Date.prototype.getUTCMilliseconds()
Date.prototype.getUTCMinutes()
Date.prototype.getUTCMonth()
Date.prototype.getUTCSeconds()
Date.prototype.setDate(date)	そのオブジェクトの日付をdateに設定する(下記、同様)
Date.prototype.setFullYear(year [, month [, date]])
Date.prototype.setHours(hour [, min [, sec [, ms]]])
Date.prototype.setMilliseconds(ms)
Date.prototype.setMinutes(min [, sec [, ms]])
Date.prototype.setMonth(month [, date])	
Date.prototype.setSeconds(sec [, ms])	
Date.prototype.setTime(time)	
Date.prototype.setUTCDate(date)	そのオブジェクトのUTCでの日付をdateに設定する(下記、同様)
Date.prototype.setFUTCullYear(year [, month [, date]])
Date.prototype.setUTCHours(hour [, min [, sec [, ms]]])
Date.prototype.setUTCMilliseconds(ms)
Date.prototype.setUTCMinutes(min [, sec [, ms]])
Date.prototype.setUTCMonth(month [, date])	
Date.prototype.setUTCSeconds(sec [, ms])	
Date.prototype.toDateString()	相当する文字列を返す
Date.prototype.toISOString()	相当する文字列(ISO 8601 Extended Format)を返す
Date.prototype.toJSON(key)	JSONで使われる日付時刻文字列を返す
Date.prototype.toLocalDateString([ reserved1 [, reserved2]])	ローカル日付文字列を返す
Date.prototype.toLocalString([ reserved1 [, reserved2]])	ローカル文字列を返す
Date.prototype.toLocalTimeString([ reserved1 [, reserved2]])	ローカル時刻文字列を返す
Date.prototype.toString()	相当する文字列を返す
Date.prototype.toTimeString()	相当する時刻文字列を返す
Date.prototype.toUTCString()	相当するUTC文字列を返す
Date.prototype.valueOf()	基準時刻からの経過ミリ秒を返す
Date.prototype.toPrimitive[@@toPrimitive](hint)	相当するプリミティブ値を返す。hintは"default"もしくは"number"、"string"のどれか。"default"は"string"と同等。

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コードを書く側としてはあまり意識する必要は無いはず。