JavaScriptデータタイプ判断
6777 ワード
JavaScriptのデータタイプは、元のタイプ(ベースタイプ)とオブジェクトのタイプ(引用タイプ)の2種類に分けられます.元のタイプは、数字、文字列、ブール値のほか、2つの特殊な元の値があります.nullとundefinedは、それ以外は対象です.オブジェクトには、行列と関数の2つの特殊なオブジェクトが含まれます.
以下のすべてのコード表式が、
共通の方法
typeof演算子を使う
データの種類を判断するには、typeof演算子が使えます.戻り値は、データの種類を表す文字列です.
Object.prototype.toStringを借りる方法
元のタイプ(基本タイプ)
数字
整数
一つの数が整数であると判断し、安全範囲内で整数を利用して整理した後であるか、それとも自身と同等の特徴がありますか?
大域的な
ブール値
ブール値は
ECMAScript 3において
存在判断
オブジェクトの種類(参照の種類)
オブジェクト
行列
配列を判断する方法: Underscore.jsオブジェクト方法 CoffeeScript The Existetial Operator MDN Object.prototype.toString()方法についての説明 MDN Number.isInteger()方法についての説明 Javascript–MAXINT:Number Limits by Vjeux
以下のすべてのコード表式が、
true
によって判定が成立した場合には、変数obj
は判定が必要な値を表しています.共通の方法
typeof演算子を使う
データの種類を判断するには、typeof演算子が使えます.戻り値は、データの種類を表す文字列です.
typeof 1 // 'number'
typeof 'abc' // 'string'
typeof false // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object'
typeof {x: 1} // 'object'
typeof [1, 2, 3] // 'object'
typeof function() {} // 'function'
typeof
演算子は、数字、文字列、ブール値、undefined
などのオリジナルのタイプを効果的に判断することができますが、配列およびオブジェクトに対しては、何もできません.Object.prototype.toStringを借りる方法
Object.prototype.toString()
メソッドを借りると、オブジェクトの種類を表す文字列が得られます.var toString = Object.prototype.toString;
toString.call('abc') // '[object String]'
toString.call(true) // '[object Boolean]'
toString.call([]) // '[object Array]'
toString.call({}) // '[object Object]'
toString.call(/./) // '[object RegExp]'
toString.call(new Date) // '[object Date]'
toString.call(Math) // '[object Math]'
この方法を使うと、配列、関数、日付、正規表現などのオブジェクトタイプ(参照の種類)を効果的に判断できます.ECMAScript 5では、null
およびundefined
を判断するために、この方法を用いることもできる.toString.call(null) // '[object Null]'
toString.call(undefined) // '[object Undefined]'
以下は特殊な状況です.元のタイプ(基本タイプ)
数字
typeof
演算子を使用して、任意の数字、NaN
、またはInfinity
を判断することができる.typeof NaN // 'number'
typeof Infinity // 'number'
NaN
およびInfinity
を排除するにはisFinite()
方法が使用されてもよいが、isFinite()
方法はいくつかの非デジタルタイプをデジタルに変換しようとしているので、二重保険が必要である.typeof obj === 'number' && isFinite(obj)
上記の式がtrue
に戻ると、変数obj
はデジタルタイプでありながらNaN
またはInfinity
ではないことが保証されます.つまり、この2つの特殊な数値が数学演算に参加することを望まないからです.ECMAScript 6の増加したNumber.isFinite()
の方法は同じ効果があります.整数
一つの数が整数であると判断し、安全範囲内で整数を利用して整理した後であるか、それとも自身と同等の特徴がありますか?
typeof obj === 'number' && isFinite(obj)
&& obj > -9007199254740992
&& obj < 9007199254740992
&& Math.floor(obj) === obj
NaN大域的な
isNaN()
方法も、いくつかの非デジタルタイプをデジタルに暗黙的に変換しようとしています.もし変換が成功すれば、この値は数字と考えられます.そうでなければ、これはNaN
と考えられます.isNaN(NaN) // true
isNaN(0/0) // true 0 0 NaN
isNaN('1') // false '1' 1
isNaN(true) // false true 1
isNaN([]) // false 0
isNaN(Infinity) // false
isNaN('abc') // true
isNaN(undefined) // true
文字列'abc'
およびundefined
はいずれも一つの数字に暗黙的に変換できないので、NaN
と判断される.NaN
は特殊な数値であり、それはいかなる値にも等しくなく、自分自身にも等しくないので、NaN
の値を判断するのに一番良い方法は、それが数字の種類であると判断することであり、同時に自身に等しくない:typeof obj === 'number' && obj != +obj
ECMAScript 6の増加したNumber.isNaN()
の方法はこの問題をより良く解決しました.NaN
の値がある時だけtrue
に戻ります.Number.isNaN(NaN) // true
Number.isNaN(Number.NaN) // true
Number.isNaN(0/0) // true
Number.isNaN(Infinity) // false
Number.isNaN('abc') // false
Number.isNaN(undefined) // false
Number.isNaN()
方法とisNaN()
方法は異なることが分かる.Number.isNaN()
方法は、特殊値であるかどうかを判断するためにのみ使用される.ブール値
ブール値は
NaN
ではなくtrue
であり、false
演算子を使用してもよいし、次のように判断してもよい.obj === true || obj === false
UdefinedECMAScript 3において
typeof
は読み書きができるので、直接undefined
と比較して返した結果は必ずしも正確ではないと思います.このようにundefined
はいくつかの実施においてその値を変更することができます.この時に比較した結果は意外です.普通はvar undefined = 1
演算子を使って判断します.typeof obj === 'undefined'
しかし、typeof
演算子を使用すると、不定義の変数と値がtypeof
である変数を区別できないという点があり、他の方法はundefined
演算子を使用しています.その演算結果は常にvoid
に戻ります.obj === void 0
Nullundefined
を使用して演算子判断typeof
はnull
に戻り、これは明らかに意図されていないので、最も良い方法は直接'object'
値と比較することである.obj === null
null
も===
に戻るので、ここではundefined == null
を使用しなければならない.存在判断
true
またはnull
の値の変数の読み取り属性にはエラーが発生するため、存在判断が必要となる場合があります.簡単にundefined
文を使って判断すると、それらを暗黙的にif
に変換できる値もすべて排除されます.例えば、数字0、空の文字列、空の配列などです.(ここでは間違いがあります.空配列はif文で単独に置くとtrueに変換されます.比較する時はfalseと同じです.例えば[]==false)そのようなものは、false
に暗黙的に変換されてもよく、false
はundefined == null
に戻り、他の非true
またはnull
の値と比較するとundefined
に戻るので、より良い方法は直接false
値と比較することである.if (obj != null) {
obj.property;
}
このようにして、変数null
がobj
でもundefined
でもないか、または以下のように判断することができる.typeof obj !== 'undefined' && obj !== null
判断があることによって、属性は安心してnull
文法で取得できます.オブジェクトの種類(参照の種類)
オブジェクト
.
と他のオブジェクトを区別するには、null
値がnull
に暗黙的に変換され得るので、次のように判断することができる.obj && typeof obj === 'object'
このように判断すればfalse
を除外することができ、変数null
はオブジェクトまたは配列または他のオブジェクト(関数を含まない)である.obj === Object(obj)
obj
方法を使用すると、入力されたパラメータがオブジェクトでないとオブジェクトに変換されます.そうでなければ、単純に入力されたパラメータを返すだけです.この方法は、関数を含むすべてのオブジェクトを判断することができます.行列
配列を判断する方法:
Object.prototype.toString.call(obj) === '[object Array]'
ECMAScript 5は、配列検出の元の方法を追加しました.Array.isArray(obj)
関数Object()
演算子は関数を特別扱いしたが、typeof
演算子を使用すると、いくつかの実装では関数ではないものもtypeof
に戻るので、関数を判断するために、以下の方法が使用される.Object.prototype.toString.call(obj) === '[object Function]'
正規表現'function'
演算子を用いて正規表現を判断すると、一般的にはtypeof
に戻るが、'object'
に戻る実装もあるので、'function'
の方法を借りて判断する.Object.prototype.toString.call(obj) === '[object RegExp]'
参考資料