js判断数据类型
在js中,我们有时候需要判断变量的数据类型,来确定下一步对数据的处理方式。
js判断数据类型没有明确的方法,需要我们自己判断,目前共有4种方法可以实现:
typeof
typeof是一个运算符,使用方式有两种:1.typeof(表达式)2.typeof 变量名。返回值为表示类型的字符串。能判断的类型有
Number、String、Boolean,Undefined、Object、Function、Symbol等。
注意:typeof null 和 typeof [] 返回的都是object。可以看出typeof并不能准确的判断出array和null。
基本类型除了null,其他的可以用typeof判断。
null和所有的引用类型的结果都是Object。
instanceof
A instanceof B 判断 A 是否为 B 的实例,如果是,则返回 true,不是则返回 false。instanceof检测的是原型,内部机制其实就是判断对象 A 的原型链中是否有 B 的原型。
语法:
变量 instanceof 构造函数名称
const a = new Date();
document.write(
a instanceof Date
)
基本数据类型的值不能用 instanceof 判断类型
由于undefined和null没有构造函数,所以使用 instanceof 会报错!
而由基本数据包装类创建的对象可以用 instanceof 判断类型。
所有的引用类型都可以用instanceof来判断。
所有的基本数据类型都不能用instanceof来判断:undefined和null会报错,其他的基本本类型河道结果永远是false。
基本类型(除了undefined和null),如果使用类似 new Number()的方式变为对象,就可以使用instanceof来判断。
constructor
当一个函数F被定义时,JS引擎会为F添加prototype原型,然后在prototype上添加一个constructor属性,并让其指向F的引用,F利用原型对象的constructor属性引用了自身,当F作为构造函数创建对象时,原型上的constructor属性被遗传到了新创建的对象上,从原型链角度讲,构造函数F就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型。
const 张三 = new F();
function F() {
}
console.log(
张三.constructor == F//true
)
constructor能判断基本数据类型string、number、boolean和对象类型(array、function等等),但是它不能判断undefined和null。所以它判断类型值也不十分准确!
Object.prototype.toString.call()
toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。
对于Object对象,直接调用toString()就能返回[object Object],而对于其他对象,则需要通过call、apply来调用才能返回正确的类型信息。
const s = undefined;
console.log(
Object.prototype.toString.apply(s)//[object undefined]
// Object.prototype.toString.call(s)
// Object.prototype.toString.bind(s)()
)
Object.prototype.toString.call() 方法是判断类型的最准确的方法!
其他判断方法
除了以上标准的方法外,还有一些其他的判断方法用于特定类型的检测,这里列出部分:
Number.isNaN
isNaN方法,有window.isNaN及Number.isNaN。
window.isNaN:先将参数转化为数字类型,再判断是否是NaN。
Number.isNaN:不会做类型转换,只有NaN返回true,其他(非NaN的数字及非数字)都为false。
Array.isArray
它是专门用于检测数组类型的。
Object.prototype.isPrototypeOf
isPrototypeOf 和 instanceof 类似,都是基于原型链和原型对象去做判断的。它用来检查一个对象是否存在于另一个对象的原型链上。