欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js判断数据类型

程序员文章站 2022-12-23 14:51:00
1: typeof 返回数据类型,包含这7种: number、boolean、symbol、string、object、undefined、function。 typeof null 返回类型错误,返回object 引用类型,除了function返回function类型外,其他均返回object。 ......

1: typeof

返回数据类型,包含这7种: number、boolean、symbol、string、object、undefined、function。

typeof null   返回类型错误,返回object

引用类型,除了function返回function类型外,其他均返回object。

其中,null 有属于自己的数据类型 null , 引用类型中的 数组、日期、正则 也都有属于自己的具体类型,而 typeof 对于这些类型的处理,只返回了处于其原型链最顶端的 object 类型,没有错,但不是我们想要的结果。

2:tostring 这个是最完美的

tostring() 是 object 的原型方法,调用该方法,默认返回当前对象的 [[class]] 。这是一个内部属性,其格式为 [object xxx] ,其中 xxx 就是对象的类型。

对于 object 对象,直接调用 tostring()  就能返回 [object object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。

判断类型举例:

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 赋值,以保证对象实例的类型不被篡改。

js判断数据类型

4:instanceof

instanceof 是用来判断 a 是否为 b 的实例,表达式为:a instanceof b,如果 a 是 b 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型

js判断数据类型

 

 

 

由上图可以看出[]的原型指向array.prototype,间接指向object.prototype, 因此 [] instanceof array 返回true, [] instanceof object 也返回true。

instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。