JavaScript 速習チュートリアル

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)isActivetrue を代入します。これは (isActive == true) で等価性をチェックしているわけではありません。
そのため、元の isActivefalse であっても、次の行はサイレントに実行され、結果として「アクティブ!」が出力されてしまいます。

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