JavaScript サイレントエラー (Silent Errors)
1. サイレントエラー(Silent Errors)とは
JavaScriptは、エラーが発生しても「静かに」失敗することがあります。
サイレントエラーが発生しても、プログラムは停止しません。そのまま実行が継続されます。
この仕様には歴史的な背景があります:
JavaScriptの最初のバージョンには、try...catch による例外処理(Exception handling)が実装されていなかったため、エラーでプログラムを止めない設計が優先されたのです。
サイレントエラーとは、例外を投げたり実行を停止させたりはしないものの、ロジックバグや予期せぬ挙動、あるいは見落としやすい失敗を引き起こす問題のことを指します。
以下に、一般的なサイレントエラーの具体例を挙げます。
2. 一般的なサイレントエラーの例
2.1 プログラムは停止しない
ゼロ除算など、他の言語ではエラーになるような操作も、JavaScriptではプログラムを停止させません。
// エラーは発生せず、x は Infinity になる
let x = 1 / 0;2.2 比較ではなく代入 (Assignment, not comparison)
条件式の中で比較演算子(== や ===)の代わりに代入演算子(=)を使ってしまうミスです。
let result = "非アクティブ";
let isActive = false;
// ❌ 比較ではなく「代入」が行われている
if (isActive = true) {
// isActive に true が代入され、条件式全体が true と判定される
result = "アクティブ!";
}解説:(isActive = true) は isActive に true を代入します。これは (isActive == true) で等価性をチェックしているわけではありません。
そのため、元の isActive が false であっても、次の行はサイレントに実行され、結果として「アクティブ!」が出力されてしまいます。
2.3 NaN の生成
数値演算に失敗した場合、多くの操作は例外を投げるのではなく NaN(Not a Number)を生成します。
JavaScriptはクラッシュしません。ただ静かに NaN を返し、そのまま処理を続けます。
// NaN - エラーは出ないが、データとしては正しくない
const result = parseInt("abc");2.4 存在しないプロパティへのアクセス
オブジェクトに存在しないプロパティ(Property)にアクセスしても、エラーにはならず単に undefined が返されます。
const user = {};
// エラーは発生せず、result は undefined になる
let result = user.name;2.5 暗黙的な型変換 (Type Coercion)
JavaScriptは、使用する演算子(Operator)によって異なる型変換(Coercion)を自動的に行います。
この仕様がバグを隠蔽し、プログラムは動き続けるものの、ロジックが破綻する原因となります。
// 文字列の結合として扱われる
let result1 = ('5' + '2'); // 結果: "52"
// 数値の減算として扱われる
let result2 = ('5' - '2'); // 結果: 3