通过获取Object原型上的toString方法,让方法中的this变为需要检测的数据类型,并且让方法执行。
在我们使用toString检测数据类型,不管你是什么类型的值,我们都可以正常检测出需要的结果(此方法检测是万能的)。typeof不能具体的检测出是数组类型还是正则类型;instanceof(当前实例是否所属这个类)不能检测出基本数据类型,instanceof检测的原理是基于原型链检测的:只要当前类在实例的原型链上,最后返回的结果都是true;constructor(获取当前要检测数据值的constructor,判断它是否是某一个数据类型内置类来检测)检测数据类型不太可靠,如果我们手动的将constructor的值改变,检测的值就不是我们想要的。(具有可读可写性,不太靠谱)
在Number、String、Boolean、Array、RegExp、Function …这些类的原型上都有一个toString方法:这个方法就是把本身的值转为字符串的。
(250).toString() -> ‘12’
(true).toString() ->‘true’
[20,30].toString() ->’[20,30]’
…
在Object这个类的原型上也有一个toString方法,但是这个方法并不是把值转为字符串,而是返回当前值的所属类的详细信息,固定结构:’[object 所属的类]'
例如:
var obj={name:‘lyc’}
obj.toString(); =>’[object Object]’ 这时调取的正是Object.prototype.toString
代码解析
obj.toString()
首先执行Object.prototyper.toString方法
这个方法中的this就是我们操作的数据值obj
总结:Object.prototype.toString执行的时候会返回当前方法中this的所属信息。也就是说,我想知道谁的所属类信息,就可以把这个toString执行,并其让this变为我们检测的这个数据值,那么返回的结果就是当前检测这个值的所属类信息。
Object.prototype.toString.call(250) =>"[object Number]"
Object.prototype.toString.call(true) =>"[object Boolean]"
Object.prototype.toString.call([250,290]) =>"[object Array]"
...
检测类型包括以下类型
"[object Number]"
"[object Boolean]"
"[object String]"
"[object Null]"
"[object Undefined]"
"[object Object]"
"[object Array]"
"[object RegExp]"
"[object Function]"
切记:我们得到的是字符串类型的,一定要记得加引号哦。