JS基础知识| 青训营笔记

60 阅读3分钟

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 类似,都是基于原型链和原型对象去做判断的。它用来检查一个对象是否存在于另一个对象的原型链上。