JavaScript

今更ES2017 (ES8) まとめ

もう今年も終わりが見えてきたけれど、ES2017についてまとめてみる。
なお予め宣言しておくがIE以外ではだいたい動く だらけ

どこに?

https://www.ecma-international.org/ecma-262/8.0/index.html

追加

String.prototype.padStart, String.prototype.padEnd

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd

  • 名前の通り、前埋め/後埋めでパディングする。
  • どちらも targetLength が必要で、padString を受け取ることができる。
  • IE以外ではだいたい動く。

特段何の変哲もないパディング。
padString の長さが足らない場合は繰り返し、余れば勝手に切り落としてよしなにしてくれるようだ。
例えば "str".padStart(10, "pad") とかやると "padpadpstr" が返ってきた。

Object.values, Object.entries

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/entries

  • 処理対象として渡した Object の有するプロパティを配列として列挙する。
  • 生成された配列をアレコレしても元オブジェクトに影響しない(当たり前か……)
  • 配列内の順序は for...in と同等。ただし、for...in と異なりプロトタイプチェーンは辿らない。
  • IE以外ではだいたい動く。

敢えて Java に例えるなら(その必要はあるのか?)Object.values は Map#values、Object.entries は Map#entrySet が近いだろうか。なるほど JavaScript はとかく連想配列である。

Object.getOwnPropertyDescriptors

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors

  • 対象オブジェクトのプロパティ情報(記述子オブジェクト)を取得できる。
  • 記述子オブジェクトは configurable, enumerable, writable, get, set, value をキーとして持ちうる。
  • IE以外ではだいたい動く。

デコレータなど、ややこしいことする時向け。
JavaScript においてプロパティは名前と記述子オブジェクトで構成されているらしく、これは名前から記述子オブジェクトを引き抜かせてくれる関数。

引数リストのカンマに関するルール変更

以下の記述が可能になったようだ。

function f(v1, v2, v3,){...}
f(1, 2, 3,);

オブジェクトリテラルや配列リテラルと揃えた、ということであるらしい。

async function

async function af(){...}
上記の関数 af は非同期の関数である。
「あれ?お前ES2016にいなかった?」と思ったそこのアナタ。
実はこの界隈、標準であるとみなされる(Stage 4)ためには2つ以上のブラウザに実装される必要があるらしい。ES2016が締め切られた時、実装してたのはEdgeだけだった(Stage 3)んだそーな。

非同期関数には以下の特徴がある。
* 非同期関数は内部で await を使用することができる。await を使うことで Promise.then へ関数を渡す手間を省き、同期処理の調子で書けるようになる。
* 非同期の関数は何を return しても構わないが、返したものは必ず Promise に Wrap される。例えば、1 を返せば "1 で resolve される" Promise が返る。

Promise が扱いやすくなる追加物。非同期がやりやすいのはありがたい。
IE以外ではだいたい動く。

共有メモリと Atomic

JS で共有メモリ?となるかもしれないが、これは Worker あたりを振り回して大規模な処理をする場合向けであるようだ。
SharedArrayBuffer を利用してスレッド間共有が可能になるので、かなり楽になる。
これまで同様 postMessage を使うところは同じだが、その後は SharedArrayBuffer でやり取りできる。
Atomic は、SharedArrayBuffer に対する(その名の通り)Atomicな操作のAPIであるようだ。
これは Math のようなもので、オブジェクトとして深く考える必要はなさそう。