throw expressions (Stage 2)
tc39_studyのための準備。
tc39 に throw expressions という仕様が提案されている。これは現在 Stage2 で、将来的に標準化されるとしてもこの記事に書かれている多くの API はその頃には変更されている可能性がある
この提案ではその名の通り、現在は statement のみであるthrow
を expression としても使えるようにしようというものである。
Examples
関数に必須な引数がなかったら Error を throw する
function hello(name = throw new Error("arg: name must be passed")) {
console.log(`Hello, ${name}`);
}
hello(); // Error 'arg: name must be passed'
上記のように引数のデフォルト値としてthrow ...
を指定しておく。
statement で書くと
function hello(name) {
if (name === undefined) {
throw new Error("arg: name must be passed");
}
console.log(`Hello, ${name}`);
}
となる。
三項演算子のネスト
proposal からそのまま引用する。筆者個人的にはこの場合は switch-case のほうが読みやすい気もする…
function getEncoder(encoding) {
const encoder =
encoding === "utf8"
? new UTF8Encoder()
: encoding === "utf16le"
? new UTF16Encoder(false)
: encoding === "utf16be"
? new UTF16Encoder(true)
: throw new Error("Unsupported encoding");
}
??
で値が undefined | null
だったときに Error を throw する
// throw expression
const result = obj?.a?.b ?? throw new Error("obj.a.b is undefined");
// throw statement
const result2 = obj?.a?.b;
if (result2 === undefined || result2 === null) {
throw new Error("obj.a.b is undefined");
}