JavaScriptデータタイプ判断

6777 ワード

JavaScriptのデータタイプは、元のタイプ(ベースタイプ)とオブジェクトのタイプ(引用タイプ)の2種類に分けられます.元のタイプは、数字、文字列、ブール値のほか、2つの特殊な元の値があります.nullとundefinedは、それ以外は対象です.オブジェクトには、行列と関数の2つの特殊なオブジェクトが含まれます.
以下のすべてのコード表式が、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
Udefined
ECMAScript 3においてtypeofは読み書きができるので、直接undefinedと比較して返した結果は必ずしも正確ではないと思います.このようにundefinedはいくつかの実施においてその値を変更することができます.この時に比較した結果は意外です.普通はvar undefined = 1演算子を使って判断します.
typeof obj === 'undefined'
しかし、typeof演算子を使用すると、不定義の変数と値がtypeofである変数を区別できないという点があり、他の方法はundefined演算子を使用しています.その演算結果は常にvoidに戻ります.
obj === void 0
Nullundefinedを使用して演算子判断typeofnullに戻り、これは明らかに意図されていないので、最も良い方法は直接'object'値と比較することである.
obj === null
null===に戻るので、ここではundefined == nullを使用しなければならない.
存在判断trueまたはnullの値の変数の読み取り属性にはエラーが発生するため、存在判断が必要となる場合があります.簡単にundefined文を使って判断すると、それらを暗黙的にifに変換できる値もすべて排除されます.例えば、数字0、空の文字列、空の配列などです.(ここでは間違いがあります.空配列はif文で単独に置くとtrueに変換されます.比較する時はfalseと同じです.例えば[]==false)そのようなものは、falseに暗黙的に変換されてもよく、falseundefined == nullに戻り、他の非trueまたはnullの値と比較するとundefinedに戻るので、より良い方法は直接false値と比較することである.
if (obj != null) {
  obj.property;
}
このようにして、変数nullobjでも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]'
参考資料
  • Underscore.jsオブジェクト方法
  • CoffeeScript The Existetial Operator
  • MDN Object.prototype.toString()方法についての説明
  • MDN Number.isInteger()方法についての説明
  • Javascript–MAXINT:Number Limits by Vjeux