JavaScript (MDN) は何をしますか?
このスキルは、MDNのJavaScriptガイドとリファレンスを、習慣と異なる点(落とし穴、驚くべきデフォルト動作、非推奨APIとその代替、MDN推奨のパターン)に絞って凝縮したものです。参照ファイル内の各主張の末尾には、その根拠となったMDNページへのリンクが付いています。すべてのJavaScript開発者が知っている基本は省略されています。
対応バージョン
MDNはライブのECMAScript標準を追跡しており、バージョン管理されたパスはありません。また、TC39ステージ3の機能(最終確定前のもの)も文書化しているため、例の中にはまだ広く利用できない機能が含まれている可能性があります。 https://developer.mozilla.org/en-US/docs/Web/JavaScript
最近の機能は利用可能性が限られている場合があります。特定の機能(Temporal、イテレーターヘルパー、using、Promise.try、RegExp.escape、Error.isError、Math.sumPrecise、Uint8Array.fromBase64、Setメソッド、Map.prototype.getOrInsertなど)に依存する前に、ターゲットランタイムを確認してください。MDNが実験的とマークしている項目は、参照ファイル内でそのようにラベル付けされています。
使い方
- 以下の「最重要ルール」を読んでください。これらは最も頻繁に発生する間違いをカバーしています。
- 最後の表から、タスクに合った参照ファイルを開いてください。各ファイルは独立しています。タイムゾーン、DST、または期間に関するタスクには、両方のTemporalファイルが必要です。クリーンアップや
usingに関するタスクには、イテレーターとリソース管理ファイルが必要です。 - 古いコードに触れる場合は、該当ファイルの末尾にある「古いパターン」の表を読んでください。
最重要ルール
- デフォルト値には
??を使い、||は使わない。括弧なしで混在させない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing ===を使う。Object.is()は-0と+0を区別する場合のみ使う。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Equality_comparisons_and_sameness- 自身のプロパティをテストするには
Object.hasOwn()を使い、undefinedとの比較はしない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn - 実行時にのみキーが判明するマップには、プレーンなオブジェクトではなく
Mapを使う。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#objects_vs._maps Object.prototypeや組み込みのプロトタイプを拡張しない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain- ディープコピーには
structuredClone()を使う。スプレッドとObject.assign()はシャローコピーである。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign - アロー関数で
({ ... })を返すこと:波括弧だけだとブロックと解釈される。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#function_body #privateフィールドを使い、#x in objでブランドチェックを行う。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Private_elementsfinallyブロック内で return または throw すると、保留中のエラーが飲み込まれる。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catchErrorオブジェクトをスローし、原因をnew Error(msg, { cause })でラップする。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/causethenコールバック内ではすべてのPromiseを返し、チェーンは1つのcatchで終了させる。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises- 独立した非同期処理は、逐次
awaitするのではなく、Promise.all()でまとめて開始する。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function forEachは途中で停止せず、非同期コールバックも待たない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach- 同期または非同期のコールバックは
Promise.try()でリフトする。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/try - リソースの解放には
using/await usingまたはDisposableStackを使う。クリーンアップのためにFinalizationRegistryに依存してはならない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Resource_management await using file = await fs.open(...)は2つの await が必要:1つは取得用、もう1つは破棄用。非同期クリーンアップは[Symbol.asyncDispose]に記述する。[Symbol.dispose]が返すPromiseは待機されないため。ディスポーザーは逆順で実行され、本体とディスポーザーからのエラーは1つのSuppressedErrorとして届く(error= 後、suppressed= 前)。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/await_using- イテレーターに対しては、配列にスプレッドする代わりにイテレーターヘルパーを呼び出す。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator
- デフォルトの
sort()は文字列として比較する:(a, b) => a - bを渡し、元の配列を保持するにはtoSorted()を優先する。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort - グループ化には
Object.groupBy()/Map.groupBy()を使い、reduce()は使わない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce - 文字列はUTF-16コード単位:書記素を数えるには
Intl.Segmenterを使う。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length - URLの部分をエンコードするには
encodeURIComponent()を使い、encodeURI()は使わない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI - パターン内のユーザーテキストは
RegExp.escape()でエスケープする。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/escape - 再利用される
gまたはyフラグ付き正規表現は、呼び出し間でlastIndexを保持する。matchAll()を優先する。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test - 切り捨てには
Math.trunc()、parseInt()には基数を渡し、Number.isNaN()を使う。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt - 2^53 を超える整数は BigInt が必要で、文字列、
JSON.rawJSON、またはcontext.sourceを使わない限り、JSON はそれらを破損する。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON - セキュリティ関連には
crypto.getRandomValues()を使い、Math.random()は決して使わない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random - レガシーな
DateよりもTemporalを優先する。Temporal オブジェクトは<と-でエラーをスローする:compare()を使うこと。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date ZonedDateTimeでは、固定オフセットではなくIANAタイムゾーン名を使用する。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime#time_zones_and_offsets- ゾーン付きの値はゾーン付きのままにする:
toPlainDateTime()はゾーンを削除するため、その後の算術でDSTが無視される。ZonedDateTime.from()には[zone]アノテーションが必要(ベアオフセット文字列はInstant.from()でパースする)。ZonedDateTime.since()は、largestUnitを渡さない限り、デフォルトで時間単位になる(DST終了時にPT25Hになる可能性がある)。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal/ZonedDateTime - 1つの
Intlフォーマッターを再利用し、その出力を固定文字列と比較しない。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Internationalization#formatting_data - JSONモジュールは
with { type: "json" }で読み込み、スペキュファイアはimport.meta.resolve()で解決する。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#loading_non-javascript_resources Symbol.speciesに依存しないこと:エンジンはその削除を検討中。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species
参照ファイル
| ファイル | 内容 |
|---|---|
| references/language-core-and-equality.md | == と ===、型強制、typeof、let/const/var とデッドゾーン、strictモード、ASI、8進数、実行モデル、廃止された構文 |
| references/functions-and-classes.md | アロー関数と this、デフォルトパラメータとレストパラメータ、アクセサー、bind、クラスフィールド、#private、静的ブロック、extends、super |
| references/objects-prototypes-and-proxy.md | Object.hasOwn、assign、defineProperty、freeze、groupBy、プロトタイプ、nullプロトタイプオブジェクト、Proxy、Reflect、Symbol、globalThis、eval |
| references/statements-and-operators.md | ??、?.、論理代入、スプレッド、分割代入、delete、算術とビット演算のトラップ、BigInt演算子、比較、ループ、switch、ラベル、try/finally |
| references/async-and-promises.md | Promiseチェーン、コンビネーター、Promise.try、withResolvers、allKeyed、async/awaitの順序、未処理の拒否、Promiseメモリリーク |
| references/iterators-and-resource-management.md | イテレーションプロトコル、イテレーターヘルパー、Iterator.zip/concat、ジェネレーター、using、await using、DisposableStack、SuppressedError、WeakRef、FinalizationRegistry |
| references/arrays-and-collections.md | 配列のコピーメソッド、at、includes、findLast、sort、reduce、疎配列、Array.from、Map、Setメソッド、getOrInsert、WeakMap、WeakSet |
| references/strings.md | UTF-16、コードポイントと書記素、localeCompare、normalize、replaceパターン、replaceAll、matchAll、split、String.raw、URIエンコーディング |
| references/regexp.md | RegExp.escape、メソッドの選択、lastIndex、y と d フラグ、u と v モード、\p{...}、修飾子、アンカー、グループ、後方参照、後読み |
| references/numbers-math-json.md | 浮動小数点精度、parseInt、丸め、toFixed、BigInt、Math.random、Math.sumPrecise、JSON.stringifyルール、リバイバー、JSON.rawJSON |
| references/binary-data-and-shared-memory.md | 型付き配列、DataViewのエンディアン、リサイズ可能および転送された ArrayBuffer、Uint8Array でのbase64とhex、SharedArrayBuffer、Atomics |
| references/date-and-temporal.md | Date から Temporal への移行、Temporal型の選択、共有Temporalルール、プレーンな日付と時刻、Dateコードの保守 |
| references/temporal-time-zones-and-durations.md | ZonedDateTime、IANAタイムゾーン、DSTの曖昧性解消と offset、since/until、Durationのバランス調整と丸め、Temporal.Now |
| references/intl.md | ロケールの選択とフォールバック、DateTimeFormat、NumberFormatの桁数オプション、Collator、Segmenter、PluralRules、RelativeTimeFormat、ListFormat、DurationFormat |
| references/errors-and-debugging.md | cause、Errorサブクラス、Error.isError、AggregateError、スタックトレース、一般的なランタイムエラーメッセージとその修正 |
| references/modules.md | モジュールとスクリプトの違い、ライブバインディング、循環、import()、import.meta、import属性、import defer、import source、importマップ |
クロールされたページ、バージョン情報、取得日は SOURCES.md に記載されています。