介绍四种判断JS数据类型的方法
1、typeof
typeof 是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:number、boolean、symbol、string、object、undefined、function 等。
对于基本类型,除 null 以外,均可以返回正确的结果。
对于引用类型,除 function 以外,一律返回 object 类型。
对于 null ,返回 object 类型。
对于 function 返回 function 类型
2、instanceof
instanceof 是用来判断 a 是否为 b 的实例,表达式为:a instanceof b,如果 a 是 b 的实例,则返回 true,否则返回 false。 在这里需要特别注意的是:instanceof 检测的是原型。
[] instanceof array; // true
[] instanceof object; // true
从 instanceof 能够判断出 [ ].__proto__ 指向 array.prototype,而 array.prototype.__proto__ 又指向了object.prototype,最终 object.prototype.__proto__ 指向了null,标志着原型链的结束。
因此,instanceof 只能用来判断两个对象是否属于实例关系, 而不能判断一个对象实例具体属于哪种类型。
3、constructor
当一个函数 f被定义时,js引擎会为f添加 prototype 原型,然后再在 prototype上添加一个 constructor 属性,并让其指向 f 的引用。
当执行 var f = new f() 时,f 被当成了构造函数,f 是f的实例对象,此时 f 原型上的 constructor 传递到了 f 上,因此 f.constructor == f
细节问题:
(1). null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
(2). 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 object
4、tostring
tostring() 是 object 的原型方法,调用该方法,默认返回当前对象的 [[class]] 。这是一个内部属性,其格式为 [object xxx] ,其中 xxx 就是对象的类型。
对于 object 对象,直接调用 tostring() 就能返回 [object object] 。而对于其他对象,则需要通过 call / apply 来调用才能返回正确的类型信息。