typeof
typeof运算符把类型信息当做字符串返回
- 对于原始值类型(除了null)都可以正确判断
- 对于对象(除了函数)都显示为object
原始值类型:number string boolean symbol(es6) bigint(es6) undefined null
引用类型:对象(Object)、数组(Array)、函数(Function)
//值类型判断
typeof 123 //number
typeof 'str' //string
typeof true //boolean
typeof undefined //undefined
typeof null //object
//引用类型判断
typeof function fn() { } //function
typeof { name: "age" } //object
**注意:**虽然typeof null的结果是object,但是null并不是对象,这是JS一个存在历史悠久的bug,在JS最初版本使用的是32位系统,为了考虑性能等原因,JS使用低位存储变量信息,000开头表示object,而null表示为全零,所以null被错误的判定为object。
instanceof
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链
- 通过原型链进行判断,只要在其原型链上,就会返回true
[] instanceof Array // true
{} instanceof Object // true
123 instanceof Array //false
- 可以通过Symbol.hasInstance重定义instanceof的行为,所以instanceof的结果并不一定准确。
class String{
static [Symbol.hasInstance](str){
return typeof str ==='string'
}
}
console.log('sss' instanceof String) //true
Objct.prototype.toString.call()
Object.prototype.toString方法返回对象的类型字符串。
在介绍Object.prototype.toString.call()方法之前我们先看看toString()方法和Object.prototype.toString.call()方法对比
Object.toString()和Object.prototype.toString()的区别
let obj = {}
Object.toString(obj) //function Object() { [native code] }
//通过call指定obj为Object.prototype对象中的toString方法的上下文
Object.prototype.toString.call(obj) //[object Object]
- Object.toString()是Object构造函数上的方法,返回的是对应的函数
- Object.prototype.toString()是Object原型对象上的方法,返回的是代表该对象的字符串
不懂原型的可以看这篇文章github.com/mqyqingfeng…
为什么Array,String,Number等等不能直接调用toString?
因为在Array,String,Number等都重写了toString,直接调用的话就是调用自身的原型对象上的toString()方法了。
//toString()返回对应数值的字符串表达
var age = 15;
age.toString();//'15'
//toString()返回布尔值的字符串表达
var bool = false;
bool.toString() //'false'
Object.prototype.toString()是Object原型对象上的方法,返回的是代表该对象的字符串,因此可以用来判断一个值的类型。
Object.prototype.toString()判断数据类型
//判断基本类型
console.log(Object.prototype.toString.call(2)) // "[object Number]"
console.log(Object.prototype.toString.call('')) // "[object String]"
console.log(Object.prototype.toString.call(true)) // "[object Boolean]"
console.log(Object.prototype.toString.call(undefined)) // "[object Undefined]"
console.log(Object.prototype.toString.call(null)) // "[object Null]"
//判断引用类型
console.log(Object.prototype.toString.call(Math)) // "[object Math]"
console.log(Object.prototype.toString.call({})) // "[object Object]"
console.log(Object.prototype.toString.call([])) // "[object Array]"
通用的类型判断
function type (o){
var s = Object.prototype.toString.call(o);
//match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。返回存放匹配结果的数组
return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
参考文章:
浅析 Object.prototype.toString()
如果有问题,评论区多多指教哦