JavaScript 判断数据类型的方式共有四种
- typeof 、instanceof 、constructor 、Object.prototype.toString
-
1、typeof 用法{console.log(typeof 123)}
- 结果:(number,string,boolean,symbol,undefined,function,object)
- typeof
可以准确判断除null之外的所有基本数据类型以及Function` - 针对最后的object:对于
null及其他引用数据类型(各种类)都返回 object - 注意:typeof NAN === 'number'返回true
-
2、instanceof 用法{console.log([] instanceof Array)}
- 不能判断基本数据类型,因为基本数据类型并不是构造函数的实例,没有原型链。
- 因为原型链的终点是
Object.protype => null,所以引用数据类型的原型链上都会存在Object.protype,所以引用数据类型instanceof Object的时候都返回true。 - 原型链可以被修改,所以结果值不一定准确。
-
3、constructor 用法{console.log((123).constructor)}
- 结果:(Number,String,Boolean,Symbol,Array,Object,Function,Date,RegExp,Error)
- 可以判断
null和undefined除外的所有数据类型,之所以null和undefined不可以,是因为他们作为JavaScript运行环境创建时就存在的基本数据类型,不存在constructor属性 - 基本数据类型为什么会有
constructor属性呢? 因为基本数据类型获取constructor属性的时候,JavaScript自动将基本数据类型的值转为包装对象实例,并在使用后立刻销毁实例。 - 缺点:
constructor属性可以被修改,所以结果值不一定准确。
-
4、Object.prototype.toString 返回对象的类型字符串,用法:Object.prototype.toString.call(target)
- 结果样式: '[object Number]'
// '[object Number]'
console.log(Object.prototype.toString.call(123))
// '[object String]'
console.log(Object.prototype.toString.call('123'))
// '[object Boolean]'
console.log(Object.prototype.toString.call(true))
// '[object Symbol]'
console.log(Object.prototype.toString.call(Symbol(123)))
// '[object Array]'
console.log(Object.prototype.toString.call([]))
// '[object Object]'
console.log(Object.prototype.toString.call({}))
// '[object Function]'
console.log(Object.prototype.toString.call(function(){}))
// '[object Undefined]'
console.log(Object.prototype.toString.call(undefined))
// '[object Null]'
console.log(Object.prototype.toString.call(null))
// '[object Date]'
console.log(Object.prototype.toString.call(new Date()))
// '[object RegExp]'
console.log(Object.prototype.toString.call(/\d/g))
// '[object Error]'
console.log(Object.prototype.toString.call(new Error()))