在javascript中,当咱们须要知道一个变量的基本数据类型的时候能够使用typeof,结果能够是"undefined、"boolean"、"number"、"string"、"function"和"object",而须要检测引用类型的时候ECMA Script提供了instanceof操做符。但二者在实际操做过程当中都将遇到一些问题,好比typeof在检测"RegExp"类型时候返回"function",因为Safari5以前的版本实现了call方法(ECMA-262规定内部实现了call方法的对象都应该返回"function"),因此它的结果跟其余浏览器并不相同。再好比,"instanceof"操做符它与全局做用域密切相关。当页面出现多个框架的时候,好比在第一个框架中定义一个数组,而后在第二个框架中检测那么就不能返回正确结果。
解决上面提到的问题则能够使用Object.prototype.toString()方法。好比:
var value=5;
alert(Object.prototype.toString.call(value)); //[object Number]
var value=[1,3];
alert(Object.prototype.toString.call(value)); //[object Array]
var value=function(){};
alert(Object.prototype.toString.call(value)); //[object Function]
......
每一个类的内部都有一个[[class]]的属性名而且指向它的构造函数名,当调用Object.prototype.toString()方法时,都会返回一个[object NativeConstructiorName]的字符串且原生的构造函数名与全局做用域无关。
因而,有了相应的返回字符串咱们就能够准确的判断变量的数据类型。