ポストES5の特徴
ES2015(ES6)、ES2016(ES7)以降に実装された機能をまとめています。Node.js Buffer や WHATWG Encoding API などのカスタム機能についても記載しています。
多くの機能は、DUK_USE_ES6_PROXYやDUK_USE_BUFFEROBJECT_SUPPORTなどの設定オプションで無効化することが可能です。
Duktapeの状態もkangax/compat-tableで新しいリリースのために更新されています。
概要
Feature | Specification | Status | Duktape version | Notes |
---|---|---|---|---|
Duktape object | Duktape | n/a | 1.0.0 | 値の検査やガベージコレクションの強制実行など、Duktape特有の操作を提供するオブジェクトです。 |
Proxy object | ES2015 | Partial | 1.0.0 | 部分的にサポート、以下の別のProxyトラップサポート表を参照。 |
Object.setPrototypeOf() | ES2015 | Full | 1.0.0 | Object.setPrototypeOf() は、ECMAScript E5 ではサポートされていないオブジェクトの内部プロトタイプを設定することができます。 |
Object.prototype.proto | ES2015 Annex B | Partial | 1.0.0 | Object.prototype.proto は、Object.getPrototypeOf() や Object.setPrototypeOf() と同じ機能を提供するセッター/ゲッターですが、これまで標準外の protoプロパティに依存していた既存のコードベースと互換性を持っています。このプロパティは、"ベア・オブジェクト "では使用できません。Duktapeは、オブジェクト・イニシャライザーでのprotoプロパティ名をサポートしていません。 |
Additional RegExp syntax | ES2015 Annex B | Partial | 1.0.0 | ES5 以外の RegExp フォーム(ES2015 Annex B に記載されているものがほとんど)のサポートは、リリースごとに段階的に追加されています。 |
ArrayBuffer | ES2015 | Partial | 1.3.0 | Duktapeのオリジナル実装は、Khronos仕様に基づくものです。Detached ArrayBufferはまだサポートされていません。 |
Typed arrays | ES2015 | Partial | 1.3.0 | Duktapeのオリジナル実装は、Khronosの仕様に基づいたものでした。 |
DataView | ES2015 | Partial | 1.3.0 | Duktapeのオリジナル実装は、Khronosの仕様に基づいたものでした。 |
Node.js Buffer | Node.js v6.9.1 | Partial | 1.3.0 | 当初の実装はNode.js Buffer v0.12.1、現在の目標はNode.js v6.9.1 ですが、まだすべてのメソッドが実装されているわけではありません。Duktapeは最新のNode.js Buffer APIを追跡しています。 |
const declaration | ES2015 | Partial | 1.4.0 | サポートは部分的で、constはイニシャライザが必要なことを除けば、ほとんどvarの別名に過ぎません:const変数は書き込み可能で、ブロックスコープではなく、関数スコープです。 |
Computed property names | ES2015 | Partial | 2.0.0 | オブジェクトリテラル内の計算されたメソッド名はまだサポートされていません。例{ [1+2]: 'three' }. |
Octal number literal | ES2015 | Full | 2.0.0 | 例:0o755。0755のようなレガシー8進数リテラルもサポートされています。 |
Binary number literal | ES2015 | Full | 2.0.0 | 例:0b10001010。 |
Unicode escape | ES2015 | Partial | 2.0.0 | エスケープ構文は、文字列リテラルと識別子名の両方で使用できます。RegExpではまだサポートされていません(未実装の/uフラグのサポートが必要です)。BMP以外のエスケープはサロゲートペアにデコードされます。例"山のような". |
Reflect object | ES2015 | Partial | 2.0.0 | いくつかの基本的な ECMAScript プリミティブへのアクセスを、関数呼び出しとして提供します。例えば、Reflect.construct() は new のように振る舞います。現在のところ、いくつかの制限があります。たとえば、Reflect.construct() では明示的な newTarget はサポートされていません。 |
ES2015 enumeration order | ES2015 | Full | 2.0.0 | Object.getOwnPropertyNames()は、ES2015 [[OwnPropertyKeys]] の列挙順序に従います: (1) 配列インデックスが昇順、 (2) その他のプロパティが挿入順、 (3) シンボルが挿入順です。ES2015やES2016では必須ではありませんが、Duktapeではfor-in、Object.keys()、duk_enum()全般でこれと同じ順序を踏襲しています。V8と同様、このルールは「継承レベル」ごとに順番に適用されます。つまり、継承された非重複プロパティは常に子プロパティの後に続きます。 |
Exponentiation operator | ES2016 | Full | 2.0.0 | 例:x ** y, x **= y. |
RegExp getter lenience | ES2017 draft | n/a | 2.0.0 | RegExp.prototype.flags およびその他のゲッターは、TypeError をスローせずに RegExp.prototype オブジェクトをこのバインディングとして受け入れます。RegExp.prototype の問題を参照してください。 |
Symbol object | ES2015 | Full | 2.0.0 | Duktape 2.0.0では、シンボルバインディングはデフォルトで無効化されているため、DUK_USE_SYMBOL_BUILTINを使って有効にします。 |
Encoding API | WHATWG | Full | 2.0.0 | TextEncoder()、TextDecoder()で、UTF-8エンコーディングに対応しています。 |
"global" binding | TC39 proposal | Full | 2.1.0 | 実験的に、グローバルオブジェクトのバインディングを "global" と名付けました。デフォルトでは無効になっており、DUK_USE_GLOBAL_BINDING を使用して有効にします。 |
HTML comment syntax | ES2015 | Full | 2.1.0 | ES2015 Annex B.1.3 で規定されている <!-- と --> を認識した HTML コメント構文。 |
new.target | ES2015 | Full | 2.2.0 | new.target 構文。 |
defineGetter, etc | ES2017 | Full | 2.2.0 | 付録B Object.prototype.{__defineGetter,defineSetter} と Object.prototype.{lookupGetter,lookupSetter} は、レガシーコードでも多く使用されています。 |
performance | W3C | Partial | 2.2.0 | W3C High Resolution Time API performance.now()でサブミリ秒の分解能を実現(プラットフォームが提供する場合)。 |
ES2015 Number built-in | ES2015 | Full | 2.3.0 | ES2015 からの新しい Number 組み込みプロパティ(例:EPSILON、MAX_SAFE_INTEGER、parseInt()、parseFloat())。 |
ES2016 Number built-in | ES2016 | Full | 2.3.0 | ES2016からの新しいNumber組み込みプロパティは、MIN_SAFE_INTEGERのみです。 |
@@hasInstance | ES2015 | Full | 2.3.0 | instanceofでよく知られたシンボルをサポートするようになった。 |
@@toStringTag | ES2015 | Full | 2.3.0 | Object.prototype.toString() において、@@toStringTag がよく知られたシンボルをサポートする。 |
@@toPrimitive | ES2015 | Full | 2.3.0 | ToPrimitive()で既知のシンボルをサポートしました。 |
@@isConcatSpreadable | ES2015 | Full | 2.3.0 | Array.prototype.concat で、@@isConcatSpreadable がよく知られたシンボルとしてサポートされている。 |
プロキシハンドラ(トラップ)
ECMAScript ES2015のProxyオブジェクトは、基盤となるプレーンなオブジェクトにアクセスするためのプロパティの仮想化ときめ細かいアクセス制御を可能にします。Duktapeは、ES2015のProxyオブジェクトの厳密なサブセットを実装しています。トラップの実装状況
Trap | Implemented in version | Notes |
---|---|---|
getPrototypeOf | no | |
setPrototypeOf | no | |
isExtensible | no | |
preventExtension | no | |
getOwnPropertyDescriptor | no | |
defineProperty | no | |
has | 1.0.0 | Object.hasOwnProperty()は現時点ではトラップを起動せず、objのkeyが起動します。 |
get | 1.0.0 | |
set | 1.0.0 | |
deleteProperty | 1.0.0 | |
enumerate | removed | ES2016で "enumerate "トラップが削除され、for-inでは "ownKeys "トラップが使用されています。Duktape 1.xではfor-inの "enumerate "トラップに対応しています。 |
ownKeys | 1.0.0 | 一部のトラップ結果検証(設定不可能なプロパティ、拡張不可能なターゲット)は未実装です。 |
apply | 2.2.0 | |
construct | 2.2.0 | new.targetと.prototypeの検索にいくつかの制限があります。 |
Duktape特有の動作。
- 例えば、proxy[123]は、文字列("123")ではなく、数字(123)のキー引数で .get トラップを実行します。標準的な動作は、インデックス付きオブジェクトを仮想化するときにはるかに遅くなるキーを文字列で強制することです。今後の課題は、この挙動を適合させることですが、Proxyを構成する何らかの方法を提供し、時に好まれる非強制的な挙動を提供することです。
制限事項は以下の通りです。
- ES2015 のトラップの約半分しか実装されていない。このため、Proxy オブジェクトに対して Object.defineProperty() を呼び出すと、奇妙な動作が発生します。
- 例えば、[[OwnPropertyKeys]] () で説明されている、設定できないターゲットプロパティや拡張できないターゲットオブジェクトに対する ownKeys トラップ結果検証ステップはまだ実装されていません。
- Proxyを継承したオブジェクトからプロパティを読み込む際にget trapが発動しないなど、Proxyオブジェクトの継承が必ずしも正しく動作しない。
- ES2015 の Proxy revocation 機能には対応していません。
- new Proxy()で指定されるtargetやhandlerオブジェクトは、Proxyオブジェクトそのものであってはならない。ES2015ではこのような制限はありませんが、Duktapeでは内部実装を簡略化するために、とりあえずこの制限を設けています。