妹妹老问JavaScript判断数据类型的方法,哥一次给你回答的明明白白!

Posted Ultraman_agul

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了妹妹老问JavaScript判断数据类型的方法,哥一次给你回答的明明白白!相关的知识,希望对你有一定的参考价值。

判断数据类型的几种方法

话不多说,直奔正题。

1. typeof(常用于判断基本数据类型,对于引用数据类型全部返回Object)

  • 语法: typeof [检测数据] 返回数据的类型名称

  • 特点

    • 对于基本类型,除 null 以外,均可以返回正确的结果。
    • 对于引用类型,除 function 以外,一律返回 object 类型。
    • 对于 null ,返回 object 类型。
    • 对于 function 返回 function 类型。
      var str = '字符串类型';
      var num = 123;
      var bool = true;
      var bignum = BigInt("1234567890123456789012345678901234567890");
      var d = undefined;
      var n = null;
      var s = Symbol('foo');
      var obj =  a: 1 ;
      var arr = [1, 2]
      console.log(typeof str);    // string 
      console.log(typeof num);    // number
      console.log(typeof bool);   // boolean
      console.log(typeof bignum); // bigint
      console.log(typeof d);     // undefined
      console.log(typeof n);     // object
      console.log(typeof s);     // symbol
      console.log(typeof obj);   // object
      console.log(typeof arr);   // object

2. instanceof(检测某一个实例的原型链上是否有这个类的原型属性)

  • 语法:[监测数据] instanceof [class] :返回true或false

  • 特点:

    • 可以区分复杂数据类型
    • 只要在当前实例的原型链上,我们用其检测出来的结果都是true
    • 基本类型值检测繁琐,且检测不全(undefined, null, symbol)
  • 原理:验证当前类的原型prototype是否会出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为true。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,找到返回true,未找到返回false

  • 手写instanceof

  function myinstanceOf_(left, right) 
     let proto = left.__proto__;
       let prototype = right.prototype
       while (true) 
           if (proto == null) return false
           if (proto == prototype) return true
           proto = proto.__proto__;
       
   

3. constructor (用于引用数据类型)

  • 语法: 检测数据.constructor === class
  • 特点:
    • 适合使用在引用数据类型上
    • 原型链不会干扰
  • 原理:构造函数原型上有一个 constructor 属性指向构造函数自身的,如果在实例上使用 construtor 时,就会直接使用其构造函数原型的上的该属性,并指向其构造函数。
// 可以检测其构造函数
  console.log(Number(1).constructor === Number)
   console.log([].constructor === Array); // true
   console.log(.constructor === Object);// true
   function Person()  
   console.log(new Person().constructor === Person);// true

   // 原型链不会干扰
   console.log([].constructor === Object); // false

4. Object.prototype.toString.call()(对象原型链判断方法)

  • 语法:Object.prototype.toString.call(检测数据)
  • 特点:适用于所有类型的判断检测
  • 原理:Object.prototype.toString 表示一个返回对象类型的字符串,call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果
  console.log(Object.prototype.toString.call('asdb'))              // [object String]
  console.log(Object.prototype.toString.call(false))              // [object Boolean]
  console.log(Object.prototype.toString.call(123))               // [object Number]
  console.log(Object.prototype.toString.call(undefined))         // [object Undefined]
  console.log(Object.prototype.toString.call(Symbol(1)))         // [object Symbol]
  console.log(Object.prototype.toString.call(null))              // [object Null]
  console.log(Object.prototype.toString.call( name: 'zs' ))   // [object Object]
  console.log(Object.prototype.toString.call([]))                // [object Array]
  console.log(Object.prototype.toString.call(function f1()  ))  // [object Function]
  console.log(Object.prototype.toString.call(new Date()))         // [object Date]
  console.log(Object.prototype.toString.call(/\\d/))              // [object RegExp]

这里需要留意的是打印出来的结果是[object XXX]的字符串,我们需要的结果XXX需要进行字符串截取才能获得。

以上是关于妹妹老问JavaScript判断数据类型的方法,哥一次给你回答的明明白白!的主要内容,如果未能解决你的问题,请参考以下文章

《邓哥奇遇记2》——HTTP协议状态码

JavaScript 判断数据类型的方法

JavaScript 判断数据类型的方法

JavaScript 判断数据类型的方法

javascript数据类型及数据类型判断的四种方法

java中用啥方法判断数据类型,就行 javascript中的 typeOf一样