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扱いされることによるバリデーションバグ

Posted at

##発生した問題
フォームから選択された account_role の値(0:選手)が正しく処理されず、「アカウントタイプを入力してください」というバリデーションエラーが発生していました。

##原因
JavaScriptでは数値の 0 は falsy 値として扱われます。そのため、バリデーション関数内で以下のようなコードがあると問題が発生します:

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

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

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

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

##型変換してから確認する

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

##存在確認を適切に行う

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

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

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

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

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

これらの値に対して論理否定演算子(!)を使用すると、true が返されます。そのため、値の存在チェックを行う際は、この点に注意が必要です。

##まとめ
JavaScriptでのフォームバリデーションを実装する際は、数値の 0 が有効な値である場合、単純な ! による存在チェックではなく、undefined や null との厳密な比較、または適切な型変換を行いましょう。このような細かい落とし穴に気をつけることで、ユーザー体験を損なうバグを防ぐことができます。

0
0
1

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?