上級のJavaScriptエラー 24問
8種類のエラーを、それぞれ複数パターンずつ収録しています。
- デフォルト引数はnullには適用されない(undefinedのときだけ)関数のデフォルト引数は、渡された値が厳密にundefinedのときだけ使われます。nullを渡すと「値が無い」という意図があっても、nullがそのまま使われてデフォルト値は適用されません。
- constへの再代入エラーの原因と直し方constで宣言した変数に再代入しようとしたときに出るエラーです。letやvarと違い、constは一度代入した値を別の値に差し替えることを許しません。
- sort()やreverse()は新しい配列を返さず元の配列を書き換えるArray.prototype.sortやreverseは呼び出した配列自体を並べ替える破壊的(ミューテーティング)メソッドです。戻り値だけを見て「新しい配列が作られた」と考えると、元のデータまで書き換わっていることに気づけません。
- Object.freeze()は1階層しか凍結しない(浅い凍結)Object.freeze()はオブジェクト自身の直下のプロパティの再代入・追加・削除だけを禁止します。プロパティの値がオブジェクトである場合、そのネストしたオブジェクトは凍結されず、自由に変更できてしまいます。
- プライベートフィールド外部アクセスの構文エラー原因#で始まるプライベートフィールドを、宣言したクラスの外からドットで直接読み書きしようとしたときに出るエラーです。他のエラーと違い、実行前の構文解析の段階で検出されます。
- インスタンス全体で共有したい値をstaticにし忘れるクラスのインスタンスをまたいで値を共有したい場合はstaticフィールドが必要です。staticを付け忘れると、その値はクラス自身ではなく各インスタンスに独立して属するため、期待した共有ができません。
- オブジェクトのキーは数値でも文字列に変換される(1と"1"は同じキー)JavaScriptのオブジェクトのプロパティキーは、Symbolを除きすべて文字列として扱われます。数値のキーを指定しても内部的には文字列に変換されるため、数値の1と文字列の"1"は同じキーとして衝突します。
- indexOf(NaN)が常に-1を返し、NaNを見つけられない理由Array.prototype.indexOfは===(厳密等価)で要素を探すため、自分自身とも等しくないNaNを絶対に見つけられません。includes()はSameValueZeroというNaNを特別扱いするアルゴリズムを使うため、NaNも正しく検出できます。