首先来提问一个:typeof
是否能正确判断类型?
答案是:不可以,因为由于历史原因,在判断原始类型时,typeof null
会等于object
。而且对于对象来说,除了函数,都会转换成object
。例子如下:
typeof 1 // 'number' typeof "1" // 'string' typeof null // typeof [] // 'object' typeof {} // 'object' typeof window.alert // 'function'
再来提问一个,instanceof
是否能正确判断类型?
答案是:还是不可以,虽然instanceof
是通过原型链来判断的,但是对于对象来说,Array
也会被转换成Object
,而且也不能区分基本类型string
和boolean
。例如:
function Func() {} const func = new Func() console.log(func instanceof Func) // true const obj = {} const arr = [] obj instanceof Object // true arr instanceof Object // true arr instanceof Array // true const str = "abc" const str2 = new String("abc") str instanceof String // false str2 instanceof String // true
所以该怎么办呢?这时候我们可以使用:Object.prototype.toString.call()
因为每个对象都有一个toString()
方法,当要将对象表示为文本值或以预期字符串的方式引用对象时,会自动调用该方法。默认情况下,从Object
派生的每个对象都会继承toString()
方法。如果此方法未在自定义对象中被覆盖,则toString()
返回[Object type]
,其中type
是对象类型。所以就有以下例子:
Object.prototype.toString.call(new Date()) // [object Date] Object.prototype.toString.call("1") // [object String] Object.prototype.toString.call(1) // [object Numer] Object.prototype.toString.call(undefined) // [object Undefined] Object.prototype.toString.call(null) // [object Null]
所以综合上述知识点,我们可以封装出以下通用类型判断方法:
var type = function(data) { var toString = Object.prototype.toString; var dataType = data instanceof Element ? "element" // 为了统一DOM节点类型输出 : toString .call(data) .replace(/\[object\s(.+)\]/, "$1") .toLowerCase() return dataType };
使用方法如下:
type("a") // string type(1) // number type(window) // window type(document.querySelector("h1")) // element
转载自 掘金 陈大鱼头 链接:https://juejin.im/post/5e16b8b2e51d456f60137a50
来源:https://www.cnblogs.com/xyptechnology/p/12175035.html