js 判断数据类型,常用4种方法 typeof、instanceof、constructor、Object.prototype.toString.call()
1. typeof
- 一般用来判断基本数据类型
- 判断 null 返回 object
- 判断引用数据类型,除了function, 其他返回 object, 判断 function 返回 function
console.log(typeof '123')
console.log(typeof true)
console.log(typeof 123)
console.log(typeof undefined)
console.log(typeof null)
console.log(typeof { name: '123' })
console.log(typeof ['123'])
console.log(typeof function () {})
console.log(typeof /^[a-zA-Z]{5,20}$/)
console.log(typeof new Date())
console.log(typeof new Number(123))
console.log(typeof new String('123'))
console.log(typeof new Boolean(123))
2. instanceof
- 一般用来判断引用数据类型
- 判断基本数据类型返回 false
console.log(123 instanceof Number)
console.log('123' instanceof String)
console.log(true instanceof Boolean)
console.log({} instanceof Object)
console.log([] instanceof Array)
console.log(function () {} instanceof Function)
console.log(/^[a-zA-Z]{5,20}$/ instanceof RegExp)
console.log(new Date() instanceof Date)
console.log(new Number(123) instanceof Number)
console.log(new String('123') instanceof String)
console.log(new Boolean(123) instanceof Boolean)
3. constructor
- constructor是prototype对象上的属性,指向构造函数。根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用constructor属性的。
- 除了null 和 undefined, 其他类型都可以通过constructor属性来判断类型。
- 下面所有结果都是返回true
console.log('123'.constructor === String)
console.log((123).constructor === Number)
console.log(true.constructor === Boolean)
console.log({ name: '123' }.constructor === Object)
console.log(['123'].constructor === Array)
console.log(function () {}.constructor === Function)
console.log(new Date().constructor === Date)
console.log(/^[a-zA-Z]{5,20}$/.constructor === RegExp)
console.log(new Boolean(123).constructor === Boolean)
console.log(new String('123').constructor === String)
console.log(new Number(123).constructor === Number)
4. Object.prototype.toString.call() 或者 Object.prototype.toString.apply() 可以精准判断所有的数据类型
console.log(Object.prototype.toString.call(123))
console.log(Object.prototype.toString.call('123'))
console.log(Object.prototype.toString.call(true))
console.log(Object.prototype.toString.call(null))
console.log(Object.prototype.toString.call(undefined))
console.log(Object.prototype.toString.call({ name: 123 }))
console.log(Object.prototype.toString.call([123]))
console.log(Object.prototype.toString.call(function () {}))
console.log(Object.prototype.toString.call(/^[a-zA-Z]{5,20}$/))
console.log(Object.prototype.toString.call(new Date()))