0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScriptの落とし穴: 数値0がfalsy扱いされることによるバリデーションバグ

Last updated at Posted at 2025-04-03

JavaScriptの落とし穴: 数値0がfalsy扱いされることによるバリデーションバグ
発生した問題
フォームから選択された account_role の値(0:選手)が正しく処理されず、「アカウントタイプを入力してください」というバリデーションエラーが発生していました。
原因
JavaScriptでは数値の 0 は falsy 値として扱われます。そのため、バリデーション関数内で以下のようなコードがあると問題が発生します:

if (!formData.account_role) {
// エラーを設定
errors.account_role = "アカウントタイプを入力してください";
}

ユーザーが選手(account_role = 0)を選択した場合、0 は falsy と評価されるため、この条件は true となり、値が存在しないと誤って判定されてしまいます。

解決策
以下のいずれかの方法で解決できます:
厳密な比較を使用する

// 未定義またはnullの場合のみエラーを出す
if (formData.account_role === undefined || formData.account_role === null) {
errors.account_role = "アカウントタイプを入力してください";
}

型変換してから確認する

// 数値型に変換してから条件をチェック
const roleValue = parseInt(formData.account_role, 10);
if (isNaN(roleValue)) {
errors.account_role = "アカウントタイプを入力してください";
}

存在確認を適切に行う

// プロパティの存在を確認
if (!Object.prototype.hasOwnProperty.call(formData, 'account_role')) {
errors.account_role = "アカウントタイプを入力してください";
}

サーバーに送信する前の処理
バックエンド側に送信する際は、型をチェックしてから処理しましょう:

// 送信前に型チェック
if (typeof formData.account_role === 'string') {
formData.account_role = parseInt(formData.account_role, 10);
}

avaScriptのfalsy値について
JavaScriptでは以下の値がfalsy(偽と評価される)として扱われます:

false
0(数値のゼロ)
""(空文字列)
null
undefined
NaN

これらの値に対して論理否定演算子(!)を使用すると、true が返されます。そのため、値の存在チェックを行う際は、この点に注意が必要です。
まとめ
JavaScriptでのフォームバリデーションを実装する際は、数値の 0 が有効な値である場合、単純な ! による存在チェックではなく、undefined や null との厳密な比較、または適切な型変換を行いましょう。このような細かい落とし穴に気をつけることで、ユーザー体験を損なうバグを防ぐことができます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?