js中准确判断数据类型的方法
强烈推荐的Markdown编写工具Markdown Nice,点击该链接详细琢磨
1: typeof
返回数据类型,包含这7种: number、boolean、symbol、string、object、undefined、function。
typeof null 返回类型错误,返回object
引用类型,除了function返回function类型外,其他均返回object。
其中,null 有属于自己的数据类型 Null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 Object 类型,没有错,但不是我们想要的结果。
2: toString (这个最准确,比较推荐)
Object.prototype.toString.call('') ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(Symbol()); //[object Symbol]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object global] window 是全局对象 global 的引用
3: constructor
constructor是原型prototype的一个属性,当函数被定义时候,js引擎会为函数添加原型prototype,并且这个prototype中constructor属性指向函数引用, 因此重写prototype会丢失原来的constructor。
不过这种方法有问题:
1:null 和 undefined 无constructor,这种方法判断不了。
2:还有,如果自定义对象,开发者重写prototype之后,原有的constructor会丢失,因此,为了规范开发,在重写对象原型时一般都需要重新给 constructor 赋值,以保证对象实例的类型不被篡改。
''.constructor==String
true
(1).constructor==Number
true
false.constructor==Boolean
true
[].constructor==Array
true
4: instanceof
instanceof 是用来判断 A 是否为 B 的实例,表达式为:A instanceof B,如果 A 是 B 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型,
var arr=[1,2,3];
arr instanceof Array
true
var str='abc';
str instanceof String
false //因为这是基本类型,instanceof只是用来判断对象的
var str2=new String('abc');//用new生成的字符串'abc'属于,string包装对象,本身是一个对象,所以可以检测
str2 instanceof String
true
var o={name:'Tom'};
o instanceof Object
true
注意:推荐除了以上说的方法判断数据类型外,判断一个数据类型是数组还以可以用Array.isArray([])
本文使用 mdnice 排版