ECMAScriptの便利そうなproposals
proposal段階の機能もcore-js経由で使用できる
proposalsに興味を持ったきっかけのiterator helpers
JSでは [0, 1, 2].filter(n => n % 2 === 0).map(n => n * n)
のように書くと、filter
や map
を呼び出す度に配列が作られるが、他の言語のように遅延評価で中間の配列を作らず map
等ができるようになる。
function* naturals() {
let i = 0;
while (true) {
yield i;
i += 1;
}
}
const result = naturals()
.map(value => {
return value * value;
});
result.next(); // {value: 0, done: false};
result.next(); // {value: 1, done: false};
result.next(); // {value: 4, done: false};
コード例はリンク先から引用しています。
これより下のコメントについても同様にコード例はリンク先から引用しています。
関連して groupBy
const array = [1, 2, 3, 4, 5];
// `Object.groupBy` groups items by arbitrary key.
// In this case, we're grouping by even/odd keys
Object.groupBy(array, (num, index) => {
return num % 2 === 0 ? 'even': 'odd';
});
// => { odd: [1, 3, 5], even: [2, 4] }
// `Map.groupBy` returns items in a Map, and is useful for grouping
// using an object key.
const odd = { odd: true };
const even = { even: true };
Map.groupBy(array, (num, index) => {
return num % 2 === 0 ? even: odd;
});
// => Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }
Record & Tuple。イミュータブルなオブジェクトと配列。等号で比較できる。
polyfill
polyfillの実装法の話が面白い
Iterator.range
for (const i of Iterator.range(0n, 43n)) console.log(i) // 0n to 42n
Iterator.range(0, Infinity)
.take(1000)
.filter((x) => !(x % 3))
.toArray()
function* even() {
for (const i of Iterator.range(0, Infinity)) if (i % 2 === 0) yield i
}
;[...Iterator.range(1, 100, 2)] // odd number from 1 to 99
Pythonのrangeみたいなやつ
ライブラリを普段選ぶときは人気度や開発の活発さで選んでいるが、ユーティリティ系はESNextのpolyfillを選ぶという選択肢もあるのかも
proposalのstageがどの程度の安定度を表しているのか要確認
機能が似ているライブラリがproposals載っているのも嬉しい
たとえばrecordにはimmerが対応するライブラリとして挙げられている
雰囲気で掘っていたけどリストがあった
jsonのimport
import json from "./foo.json" assert { type: "json" };
import("foo.json", { assert: { type: "json" } });
Temporal
JSの Date
はタイムゾーン情報を内部に保持しなかったりかなり厳しめなのだが、それを改善したもの
日付 (Temporal.PlainDate) やタイムゾーン込みの日時 (Temporal.ZonedDateTime) があり、かなりよさそう。他にもいろいろあるっぽい。
Dateからは以下のような手順で変換できそう?
Date→Instant→ZonedDateTime→PlainDate
Stage 4までいくと致命的な問題がない限り変更不可
Stage 3で変更はIncrementalらしい
decoratorってTSのイメージだったけど、JSでも提案されてるのか
Pipe Operator
こんな感じで処理の結果を次の処理の引数にすることができるようになる。
Object.keys(envars)
.map(envar => `${envar}=${envars[envar]}`)
.join(' ')
|> `$ ${%}`
|> chalk.dim(%, 'node', args.join(' '))
|> console.log(%);
まさかみんな大好きPipeがproposalsにあるとは。