typeof
どちらもinstanceof
データ型の判定方法で、違いは以下の通りです。
-
typeof
変数の基本型を返し、instanceof
ブール値を返します -
instanceof
複雑な参照データ型を正確に判断できるが、基本データ型を正しく判断できない -
また、
typeof
デメリットもあります.基本データ型(除く)は判定できますがnull
、参照データ型はfunction
型以外は判定できません.
上記の 2 つの方法には欠点があり、すべてのシナリオのニーズを満たすことができないことがわかります。
一般的な検出データ型が必要な場合は、それを使用してObject.prototype.toString
このメソッドを呼び出し、統一された形式“[object Xxx]”
の文字列を返すことができます
次のように:
Object.prototype.toString({}) // "[object Object]"
Object.prototype.toString.call({}) // 同上结果,加上call也ok
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call('1') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call(null) //"[object Null]"
Object.prototype.toString.call(undefined) //"[object Undefined]"
Object.prototype.toString.call(/123/g) //"[object RegExp]"
Object.prototype.toString.call(new Date()) //"[object Date]"
Object.prototype.toString.call([]) //"[object Array]"
Object.prototype.toString.call(document) //"[object HTMLDocument]"
Object.prototype.toString.call(window) //"[object Window]"
toString
の基本的な使い方を理解したら、グローバルで一般的なデータ型の判定方法を実装しましょう。
function getType(obj){
let type = typeof obj;
if (type !== "object") { // 先进行typeof判断,如果是基础数据类型,直接返回
return type;
}
// 对于typeof返回结果是object的,再进行如下的判断,正则返回结果
return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1').toLowerCase();
}
次のように使用します。
getType([]) // "array" typeof []是object,因此toString返回
getType('123') // "string" typeof 直接返回
getType(window) // "window" toString返回
getType(null) // "null",typeof null是object,需toString来判断
getType(undefined) // "undefined" typeof 直接返回
getType() // "undefined" typeof 直接返回
getType(function(){}) // "function" typeof 能判断
getType(/123/g) //"regExp" toString返回