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");
}
変更履歴

360d0cfd Add icon variations