JS中的数据类型

一、简介

JavaScript 的数据类型,共有七种:

  1. 数值(number):整数和小数。
  2. 字符串(string):文本。
  3. 布尔值(boolean):表示真伪的两个特殊值,即true(真)和false(假)。
  4.  undefined :表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值。
  5.  null :表示空值,即此处的值为空。
  6. 对象(object):各种值组成的集合。
  7. Symbol:表示独一无二的值。

对象是最复杂的数据类型,又可以分成三个子类型。

二、判断数据类型方法

  • typeof

    • typeof返回一个值的数据类型,它的返回值是一个字符串类型
      typeof 123 // "number"
      typeof '123' // "string"
      typeof false // "boolean"
      typeof function f() {}  // "function"
      typeof undefined  // "undefined"
      typeof window // "object"
      typeof {} // "object"
      typeof [] // "object"
      typeof null // "object"
      typeof Symbol() // "symbol"
  • 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
      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
  • constructor

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

    • toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。  
    • 对于Object对象,直接调用toString()就能返回[object Object],而对于其他对象,则需要通过call、apply来调用才能返回正确的类型信息。
    • 封装一个准确判断数据类型的函数:

    • function getType(obj) {
        let type = typeof obj;
        if(type !== "object") {
           return type;  
        }
        return Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1')
      }

      正则表达式里的$1,$2:

      • $1,$2表达的是小括号里的内容,$1是第一个小括号里的内容,$2是第二个小括号里的内容,依此类推。
      • 比如(\\d{4})(\\d{2})(\\d{2})  匹配"20190919"
        
        $1是第一个括号里匹配的2019
        
        $2是第二个括号里匹配的09
        
        $3是第三个括号里匹配的19
         

   

         

   

 

 

 

 

 

posted @ 2021-08-27 16:30  lucky1010  阅读(1213)  评论(0)    收藏  举报