ルール
禁止事項 配置 割り当て 代入を 条件式の中に代入してはいけない。
混合 代入 と 条件 ロジック を作る コード エラーを起こしやすい
そして 難しくする 理解しにくくなる。 理解しにくくなる。 別々の 課題 と 論理的 チェックを分離する。
対応言語 言語 JavaScript、 TypeScript、 Python、 PHPはじめに
条件文内の代入演算子は、コンパイラやリンターが見落としがちなバグの一般的な原因です。典型的な間違いは、if文で==または===(比較)の代わりに=(代入)を使用することですが、問題はより根深いものです。条件式での意図的な代入であっても、読み取り、レビュー、デバッグが困難なコードを生み出します。代入と評価が同じ行で行われる場合、読者はどの操作が優先され、どの値が実際にテストされているかを頭の中で解析する必要があります。
なぜ重要なのか
なぜ重要なのか
バグの導入: タイプミスによる変更 === to = 構文エラーを引き起こすことはなく、ただ静かに動作を変更します。条件は比較結果ではなく、割り当てられた値(truthy/falsy)に評価されます。
コードの可読性:読者は条件式が値をテストすることを期待し、変更することを期待しません。両方が同時に発生する場合、メンテナーはどの変数がいつ変更されているかを追跡する必要があります。
コード例
❌ 非準拠:
function processUser(userData) {
if (user = userData.user) {
console.log(`Processing user: ${user.name}`);
return user.id;
}
return null;
}
function validateInput(value) {
if (result = value.match(/^\d{3}-\d{2}-\d{4}$/)) {
return result[0];
}
return false;
}
誤っている理由: 条件文内の代入は、意図的なものなのか、それともタイプミスなのかを不明瞭にします。最初の例は === が意図されていたバグである可能性があり、2番目の例は正規表現マッチングと代入が混在しているため、コードの流れを追うのが困難になります。
✅ 準拠済み:
function processUser(userData) {
const user = userData.user;
if (user) {
console.log(`Processing user: ${user.name}`);
return user.id;
}
return null;
}
function validateInput(value) {
const result = value.match(/^\d{3}-\d{2}-\d{4}$/);
if (result) {
return result[0];
}
return false;
}
これが重要である理由: 代入と条件を分離することで、意図が明確になります。読者はすぐに ユーザー が最初に抽出され、その後テストされます。正規表現の一致結果がキャプチャされ、その後評価されます。曖昧さがなく、認知負荷もありません。また、~のようなタイプミスもありません。 = vs === 明らかになります。
まとめ
代入と条件式を分離することは、特定の種類のバグを防止するシンプルなルールです。結合された操作を解析する際の認知的オーバーヘッドは、簡潔さから得られるとされる利点を上回ります。代入と評価が明確に区別された、明確で明示的なコードは、可読性を向上させ、バグを減らし、コードレビューをより効果的にします。

