Skip to content

ポストES5の特徴

ES2015(ES6)、ES2016(ES7)以降に実装された機能をまとめています。Node.js Buffer や WHATWG Encoding API などのカスタム機能についても記載しています。

多くの機能は、DUK_USE_ES6_PROXYやDUK_USE_BUFFEROBJECT_SUPPORTなどの設定オプションで無効化することが可能です。

Duktapeの状態もkangax/compat-tableで新しいリリースのために更新されています。

概要

FeatureSpecificationStatusDuktape versionNotes
Duktape objectDuktapen/a1.0.0値の検査やガベージコレクションの強制実行など、Duktape特有の操作を提供するオブジェクトです。
Proxy objectES2015Partial1.0.0部分的にサポート、以下の別のProxyトラップサポート表を参照。
Object.setPrototypeOf()ES2015Full1.0.0Object.setPrototypeOf() は、ECMAScript E5 ではサポートされていないオブジェクトの内部プロトタイプを設定することができます。
Object.prototype.protoES2015 Annex BPartial1.0.0Object.prototype.proto は、Object.getPrototypeOf() や Object.setPrototypeOf() と同じ機能を提供するセッター/ゲッターですが、これまで標準外の protoプロパティに依存していた既存のコードベースと互換性を持っています。このプロパティは、"ベア・オブジェクト "では使用できません。Duktapeは、オブジェクト・イニシャライザーでのprotoプロパティ名をサポートしていません。
Additional RegExp syntaxES2015 Annex BPartial1.0.0ES5 以外の RegExp フォーム(ES2015 Annex B に記載されているものがほとんど)のサポートは、リリースごとに段階的に追加されています。
ArrayBufferES2015Partial1.3.0Duktapeのオリジナル実装は、Khronos仕様に基づくものです。Detached ArrayBufferはまだサポートされていません。
Typed arraysES2015Partial1.3.0Duktapeのオリジナル実装は、Khronosの仕様に基づいたものでした。
DataViewES2015Partial1.3.0Duktapeのオリジナル実装は、Khronosの仕様に基づいたものでした。
Node.js BufferNode.js v6.9.1Partial1.3.0当初の実装はNode.js Buffer v0.12.1、現在の目標はNode.js v6.9.1 ですが、まだすべてのメソッドが実装されているわけではありません。Duktapeは最新のNode.js Buffer APIを追跡しています。
const declarationES2015Partial1.4.0サポートは部分的で、constはイニシャライザが必要なことを除けば、ほとんどvarの別名に過ぎません:const変数は書き込み可能で、ブロックスコープではなく、関数スコープです。
Computed property namesES2015Partial2.0.0オブジェクトリテラル内の計算されたメソッド名はまだサポートされていません。例{ [1+2]: 'three' }.
Octal number literalES2015Full2.0.0例:0o755。0755のようなレガシー8進数リテラルもサポートされています。
Binary number literalES2015Full2.0.0例:0b10001010。
Unicode escapeES2015Partial2.0.0エスケープ構文は、文字列リテラルと識別子名の両方で使用できます。RegExpではまだサポートされていません(未実装の/uフラグのサポートが必要です)。BMP以外のエスケープはサロゲートペアにデコードされます。例"山のような".
Reflect objectES2015Partial2.0.0いくつかの基本的な ECMAScript プリミティブへのアクセスを、関数呼び出しとして提供します。例えば、Reflect.construct() は new のように振る舞います。現在のところ、いくつかの制限があります。たとえば、Reflect.construct() では明示的な newTarget はサポートされていません。
ES2015 enumeration orderES2015Full2.0.0Object.getOwnPropertyNames()は、ES2015 [[OwnPropertyKeys]] の列挙順序に従います: (1) 配列インデックスが昇順、 (2) その他のプロパティが挿入順、 (3) シンボルが挿入順です。ES2015やES2016では必須ではありませんが、Duktapeではfor-in、Object.keys()、duk_enum()全般でこれと同じ順序を踏襲しています。V8と同様、このルールは「継承レベル」ごとに順番に適用されます。つまり、継承された非重複プロパティは常に子プロパティの後に続きます。
Exponentiation operatorES2016Full2.0.0例:x ** y, x **= y.
RegExp getter lenienceES2017 draftn/a2.0.0RegExp.prototype.flags およびその他のゲッターは、TypeError をスローせずに RegExp.prototype オブジェクトをこのバインディングとして受け入れます。RegExp.prototype の問題を参照してください。
Symbol objectES2015Full2.0.0Duktape 2.0.0では、シンボルバインディングはデフォルトで無効化されているため、DUK_USE_SYMBOL_BUILTINを使って有効にします。
Encoding APIWHATWGFull2.0.0TextEncoder()、TextDecoder()で、UTF-8エンコーディングに対応しています。
"global" bindingTC39 proposalFull2.1.0実験的に、グローバルオブジェクトのバインディングを "global" と名付けました。デフォルトでは無効になっており、DUK_USE_GLOBAL_BINDING を使用して有効にします。
HTML comment syntaxES2015Full2.1.0ES2015 Annex B.1.3 で規定されている <!-- と --> を認識した HTML コメント構文。
new.targetES2015Full2.2.0new.target 構文。
defineGetter, etcES2017Full2.2.0付録B Object.prototype.{__defineGetter,defineSetter} と Object.prototype.{lookupGetter,lookupSetter} は、レガシーコードでも多く使用されています。
performanceW3CPartial2.2.0W3C High Resolution Time API performance.now()でサブミリ秒の分解能を実現(プラットフォームが提供する場合)。
ES2015 Number built-inES2015Full2.3.0ES2015 からの新しい Number 組み込みプロパティ(例:EPSILON、MAX_SAFE_INTEGER、parseInt()、parseFloat())。
ES2016 Number built-inES2016Full2.3.0ES2016からの新しいNumber組み込みプロパティは、MIN_SAFE_INTEGERのみです。
@@hasInstanceES2015Full2.3.0instanceofでよく知られたシンボルをサポートするようになった。
@@toStringTagES2015Full2.3.0Object.prototype.toString() において、@@toStringTag がよく知られたシンボルをサポートする。
@@toPrimitiveES2015Full2.3.0ToPrimitive()で既知のシンボルをサポートしました。
@@isConcatSpreadableES2015Full2.3.0Array.prototype.concat で、@@isConcatSpreadable がよく知られたシンボルとしてサポートされている。

プロキシハンドラ(トラップ)

ECMAScript ES2015のProxyオブジェクトは、基盤となるプレーンなオブジェクトにアクセスするためのプロパティの仮想化ときめ細かいアクセス制御を可能にします。Duktapeは、ES2015のProxyオブジェクトの厳密なサブセットを実装しています。トラップの実装状況

TrapImplemented in versionNotes
getPrototypeOfno
setPrototypeOfno
isExtensibleno
preventExtensionno
getOwnPropertyDescriptorno
definePropertyno
has1.0.0Object.hasOwnProperty()は現時点ではトラップを起動せず、objのkeyが起動します。
get1.0.0
set1.0.0
deleteProperty1.0.0
enumerateremovedES2016で "enumerate "トラップが削除され、for-inでは "ownKeys "トラップが使用されています。Duktape 1.xではfor-inの "enumerate "トラップに対応しています。
ownKeys1.0.0一部のトラップ結果検証(設定不可能なプロパティ、拡張不可能なターゲット)は未実装です。
apply2.2.0
construct2.2.0new.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では内部実装を簡略化するために、とりあえずこの制限を設けています。