無効値判定
空判定
多くの場合、無効値と判断されるのが null, undefined, empty, 空文字列、全空白文字列、空配列、NaN などの特殊値である。
なぜ無効値判定が必要か?
未定義であることを示す。(undefined)
不正であることを示す。(invalid)
まだ値が設定されていないことを示す。(empty, undefined)
指定をしない、しなかったことを示す。(not specified)
未入力であることを示す。(no input)
結果がなかったことを示す。(not found, no data)
無効であることを示す。(expired, out of valid period)
非数 (Not a number, NaN)
table:notvalue
C false NULL -
Java false null - Double.NaN, Float.NaN
JavaScript false null undefined NaN "" [] {}
.NET(C#) false null Double.NaN, Single.NaN
PHP FALSE NULL (isset) NAN
VBA False Nothing, Null(Variantのみ) Empty(Variantのみ)
https://stackoverflow.com/questions/2731445/testing-for-nan-in-vba-vb6
安全性を考えると、文字列変換して "1.#QNAN" と比較する
なぜ true, false ではないのか?
有効な値と同時に有効な値以外の無効な値を持つことで1つのパラメータで済ませることができる。
無効かどうかを別のフラグで持つこともできるが、記憶容量を必要とし、パラメータも増えてしまう。
null をなくせば Null Pointer Exception はなくせるが、他の無効値がなくなるわけではない。
未入力、未設定は必ずそのパラメータそのものに縛られる。
そうでなければ、いちいちインジケータを付けることになる。
インジケータは結局、「変数名+インジケータ名」となるしかなく、同時に書かなければならず、タイプ数が増えるだけ。
問題
正しく全部判定しようとすると、多種の判定が必要で条件の組み合わせが複雑化する。
空文字列の呼び方が不明瞭。
英語では、empty string であり、省略されて empty と呼ばれることがあるが、言語的に empty 値を持つ言語もあるため混乱しやすい。
空白文字列と空文字列との呼び方の混同
blank string と empty string だが、文字面上の混同と、そもそも区別が付いていない人がいる。
空文字列と全空白文字列との判定にブレがある。
文字列が入っていれば全て有効値
JavaScript
typeof s === "string"
空文字列は無効値
JavaScript
typeof s === "string" && s.length !== 0
空文字列と全空白文字列は無効値
JavaScript
typeof s === "string" && s.trim().length !== 0
混乱を招かない程度であれば、以下のような条件が限界か
isString(s) && !isEmptyOrBlank(s)
code:isString.js
function isString(s) {
return typeof s === "string";
}
code:isEmptyOrBlank.js
function isEmptyOrBlank(s) {
// 任意の値が設定される可能性があるため、typeof s === "string" は外すことができない。
// isString(s) と呼び出しが重複するが、条件反転だけだと意味が異なる。このため共有はできない。
return typeof s === "string" && (s.length === 0 || s.trim().length === 0 );
}
code:isEmpty.js
function isEmpty(s) {
// 任意の値が設定される可能性があるため、typeof s === "string" は外すことができない。
// isString(s) と呼び出しが重複するが、条件反転だけだと意味が異なる。このため共有はできない。
return typeof s === "string" && s.length === 0;
}
参考
JavaScriptでの「空」の値についてのおさらい https://qiita.com/ka215/items/354c6c405e015c49fcf8