a7650 / my-blog

记录总结问题
0 stars 0 forks source link

JS类型判断方法 #2

Open a7650 opened 5 years ago

a7650 commented 5 years ago

JS总共有7种类型,分别是string,number,null,undefined,boolean,symbol以及object,除了最后一个object是复杂类型其余全是基本类型。

判断类型的函数主要有:typeof ,instanceof,constructor,Object.prototype.toString.call(),Array.isarray()

typeof

typeof返回的值可能是 stringnumberundefinedbooleansymbol,以及objectfunction,且均是字符串

null,array,date等均返回object,所以用typeof来检测一个数据是否为对象类型不是很精确。 另 typeof Number(1) === 'number'; typeof new Number(1) === 'object';因为使用new的时候会返回一个对象

instanceof

instanceof用来判断某一个对象是否是一个构造函数的实例,或者在该对象的原型链上是否存在一个构造函数,用法 object instanceof constructor ,该方法一般用来判断对象,如果直接传入数字,字符串等会返回false,但是用基本包装类型可以判断,如 var a = new Number(1)这里的a就是构造函数Number的实例,可以用instanceof判断。 另外,虽然用typeof null 返回的是对象,但是如果null instanceof Object的话,返回的是false, 这是因为虽然null是对象(这是js的一个bug,null是一个类型,所以它应该是null类型),但是null却不是Object的实例,原型链最上面是Object.prototype,所有的object类型都继承这里的原型方法,但是Object.prototype的上面是null,null才是原型链的最顶层,即Object.prototype.__proto__===nullundefined instanceof Undefined 和 null instanceof Null也都会返回false,因为Undefined 和Null都不是构造函数。

constructor

constructor存在于一个对象的原型中,

Object.prototype.toString.call

该方法用来检测object比较准确,用Object原型的toString方法而不用具体实例的方法(如“str”.toString())是因为object所有类型(以上七种),(Array,Function,Date等均为Object的下层类型)以及基本包装类型(Number,String,Boolean),均重写了适应本数据类型的toString方法。 该方法判断任何内置类型均会返回正常的值,但是自定义类型不能判断出来,还是[object Object] 该方法判断原生JSON对象也会返回正确的。

*判断一个数据是否为null可以①直接x===null,② Object.prototype.toString.call