用Object.prototype.toString.call(obj)检测对象类型

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

js中监测变量类型的方法

使用typeof 判断变量类型

使用typeof 判断下变量类型看下:


不看不知道,一看吓一跳,竟然连null都是object,所以用typeof 判断变量的类型是不靠谱的;

使用Object.prototype.toString.call(obj)

直接上测试结果

所以结果显示这个方法还是比较靠谱的,(但是无法区分自定义对象类型,自定义类型可以采用instanceof区分),所以这个方法判断基本类型的变量和内置变量是非常靠谱的;

为啥不直接用toString()方法呢


toString方法的用法:toString方法返回反映这个对象的字符串;
对照toString的用法,我们看到图中的变量d的返回和其他的变量有所区别,它返回的并不是"{"a":1,"b":1,"c":1}"而是"[object Object]",这就是我们为什么要用Object.prototype.toString.call(obj)来监测变量类型而不直接用toString的原因了;

在js中所有的对象类型(Array,Date,Function等)都是Object的实例,Object有一个toString方法也被这些实例继承下来,但是这些实例都无一例外的重写了toString方法,根据原型链的知识,直接调用toString,调用的只是重写过后的toString方法,所以也就不会像Object那样返回带有类型的字符串了,
如果我们删除了一个实例的toString方法会怎么样呢?


哈哈 是不是和调用Object.prototype.toString.call(obj)一样了,这是因为删掉数组的toString方法后,数组只能去父级寻找toString方法,所以调用的自然就是Object的toString方法了

推荐阅读更多精彩内容