目录
我们在操作数据的过程中可能要对数据类型进行判断,那么常见的几种判断方法有几种呢,下面我就给大家分享一下
一、typeof操作符
typeof操作符可以判断除了null以外的基础数据类型,对于数组,对象等引用类型就无法判断了 (函数类型可以判断)
typeof "a" //string 可以判断字符串类型
typeof undefined //undefined 可以判断未定义类型
typeof 1 //number 可以判断数字类型
typeof true //boolean 可以判断布尔类型
typeof Symbol(); // symbol 可以判断symbol类型
typeof new Function(); // function 可以判断函数类型
typeof null //object 无法判断null类型
typeof {} //object 无法判断对象类型
typeof [] //object 无法判断数组类型
二、instanceof
instanceof 检测的是原型,表达式为:A instanceof B
,如果 A 是 B 的实例,则返回 true,否则返回 false。
new Object() instanceof Object // true
[] instanceof Array //true
[] instanceof Object //true
new Date() instanceof Date; // true
function Person(){};
new Person() instanceof Person; //true
Person instanceof Object //true
new Date() instanceof Object; // true
new Person instanceof Object; // true
虽然 instanceof 能够判断出 [ ] 是Array的实例,但它认为 [ ] 也是Object的实例,为什么呢?
从 instanceof 能够判断出 [ ].__proto__ 指向 Array.prototype,而 Array.prototype.__proto__ 又指向了Object.prototype,最终 Object.prototype.__proto__ 指向了null,标志着原型链的结束。因此,[ ]、Array、Object 就在内部形成了一条原型链。
弊端:instanceof虽然可以判断数组类型,但是仅限于只有一个全局执行上下文,如果网页里有多个框架(例如使用iframe),则可能涉及两 个不同的全局执行上下文,因此就会有两个不同版本的 Array 构造函数。如果要把数组从一个框架传 给另一个框架,则这个数组的构造函数将有别于在第二个框架内本地创建的数组,此时instanceof判断结果为false。可以用Array.isArray()来判断比较准确
三、constructor
当一个函数 F被定义时,JS引擎会为F添加 prototype 原型,然后再在 prototype上添加一个 constructor 属性,并让其指向 F 的引用,所以我们可以用constructor来进行判断类型,如下所示
"a".constructor === String // true
new Number(1).constructor === Number //true
true.constructor === Boolean // true
new Function().constructor === Function //true
new Date().constructor === Date //true
Symbol(0).constructor === Symbol //true
new Error().constructor === Error //true
[].constructor === Array //true
new Object().constructor === Object //true
总结:
1. null 和 undefined 是无效的对象,因此是不会有 constructor 存在的,这两种类型的数据需要通过其他方式来判断。
2. 函数的 constructor 是不稳定的,这个主要体现在自定义对象上,当开发者重写 prototype 后,原有的 constructor 引用会丢失,constructor 会默认为 Object。
四、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 的引用