欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js判断数据类型的四种方法

程序员文章站 2022-04-23 08:17:44
1.typeof typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括number,string,boolean,undefined,object,function,symbol等。 2.instanceof insta ......

1.typeof

  typeof是一个操作符,其右侧跟一个一元表达式,并返回这个表达式的数据类型。返回的结果用该类型的字符串(全小写字母)形式表示,包括number,string,boolean,undefined,object,function,symbol等。

typeof "";  //string
typeof 1;   //number
typeof false; //boolean
typeof undefined; //undefined
typeof function(){}; //function
typeof {}; //object
typeof symbol(); //symbol
typeof null; //object
typeof []; //object
typeof new date(); //object
typeof new regexp(); //object

2.instanceof

  instanceof用来判断a是否为b的实例,表达式为:a instanceof b,如果a是b的实例,则返回true,否则返回false。instanceof检测的是原型,内部机制是通过判断对象的原型链中是否有类型的原型。

{} instanceof object; //true
[] instanceof array;  //true
[] instanceof object; //true
"123" instanceof string; //false
new string(123) instanceof string; //true

我们可以用下面的代码实现instanceof。

function instance(left,right){
    let prototype = right.prototype;  //获取类型的原型
    let proto = left.__proto__;       //获取对象的原型
    while(true){    //循环判断对象的原型是否等于类型的原型,直到对象原型为null,因为原型链最终为null
       if (proto === null || proto === undefined){
           return false;
       }
       if (proto === prototype){
           return true;
       }
       proto = proto.__proto__;
     }
}
console.log(instance({},object)); //true
console.log(instance([],number)); //false

3.constructor

  当一个函数f被定义时,js引擎会为f添加prototype原型,然后在prototype上添加一个constructor属性,并让其指向f的引用,f利用原型对象的constructor属性引用了自身,当f作为构造函数创建对象时,原型上的constructor属性被遗传到了新创建的对象上,从原型链角度讲,构造函数f就是新对象的类型。这样做的意义是,让对象诞生以后,就具有可追溯的数据类型。

js判断数据类型的四种方法

4.object.prototype.tostring()

  tostring()是object的原型方法,调用该方法,默认返回当前对象的[[class]]。这是一个内部属性,其格式为[object xxx],其中xxx就是对象的类型。

  对于object对象,直接调用tostring()就能返回[object object],而对于其他对象,则需要通过call、apply来调用才能返回正确的类型信息。

  js判断数据类型的四种方法

js判断数据类型的四种方法

  封装一个准确判断数据类型的函数

function gettype(obj){
  let type  = typeof obj;
  if(type != "object"){
    return type;
  }
  return object.prototype.tostring.call(obj).replace(/^\[object (\s+)\]$/, '$1');
}