🌼

正式仕様リリース! JavaScriptの最新仕様ES2022で追加された「全」新機能

に公開
4
GitHubで編集を提案

Discussion

yasshyassh

ES2022とは関係のない点を指摘することをお許しください。

export const { translations } =
  navigator.language.includes("en") ?
    await import("./i18n/lang-en.js"):
    await import("./i18n/lang-ja.js");

この例は、navigator.language.includes("en")の部分があまりよくないと思います。

仕様によると、navigator.languageBCP 47の言語タグを返すとされています。そしてBCP 47の言語タグは、次のような形式らしいです。

 langtag       = language
                 ["-" script]
                 ["-" region]
                 *("-" variant)
                 *("-" extension)
                 ["-" privateuse]

navigator.languageの返り値のうち、languageの部分が"en"ではなくても、script、region、variantなどに"en"が含まれていた場合、navigator.language.includes("en")trueを返してしまうでしょう。

この問題を回避するために、navigator.language.includes("en")ではなく/^en\b/.test(navigator.language)と書くほうがよいと思います。(MDNのNavigator.languageのページの例も、そのように書かれています。)

鹿野 壮鹿野 壮

ご指摘のとおりでしたので更新いたしました!
細かい部分までお読みいただき、ありがとうございます!

Nozomu IkutaNozomu Ikuta

素晴らしいまとめ記事をありがとうございます!

以下、1点念のため確認したいです。


Error Causeの部分で以下2つのコードが例示されています。

.catch(error) {
  throw new Error("fooプロパティなんてないよ😡");
}
.catch(error) {
  throw new CustomError("fooプロパティなんてないよ😡", error);
}

これらは、try-catchブロックの // どうする? の部分に相当するコードだと認識しているのですが、その場合はPromise Chainの catch メソッドではなくて } catch (error) { ... } ではないでしょうか?

try {
  if (Math.random() > 0.5) {
    baz.qux;
  }
} catch (error) {
  // どうする?
}
鹿野 壮鹿野 壮

ありがとうございます!
ご指摘のとおりでしたので修正しました🙏