Javascript的数据类型与检测

103 阅读3分钟

Javascript中的数据类型与检测


基本数据类型(值类型/原始值类型)

  1. number
  • 数字类型中特殊的值:
  • NaN:不是有效数字,但是却属于number类型,与所有值都不相等,除了一个数可以是任何值。
  • 判断是否为NaN,使用isNaN()方法进行判断。用来检测是否为非效数字。
  • isNaN('CC');//在检测的时候,当这个值如果不是数字类型的时候,会先进行隐式转换为数字 ,在进行检测;这里就会返回true。
  • Infinity是一个无穷大的值
  1. string

  2. null

  3. undefined

  4. symbol

通过Symbol()函数创建出来的唯一值

Symbol('A')==Symbol('A');//false
  1. bigint
  • BigInt:大数据值
  • JS存在最大和最小的安全数字,超出范围则会导致不精准,就使用bigint处理
//最大安全数
console.log(Number.MAX_SAFE_INTEGER)
9007199254740991
//最小安全数
console.log(Number.MIN_SAFE_INTEGER)
-9007199254740991
//下面的数字超出了安全范围因此会出现不准确的情况,这个时候就要用bigint
console.log(9007199254740991+1)//9007199254740992
console.log(9007199254740991+2)//9007199254740992
//使用bigint
9007199254740991n //bigint类型的写法

引用数据类型

  1. object

    • 普通对象
    • 实例对象
    • 数组对象
    • 正则对象
    • 日期对象
    • Math数学函数对象
    • prototype原型对象
  2. function

数据类型检测

  1. typeof
    • 检测出来的结果是字符串,表示类型的字符串
    • 不能区分对象object类型,用于表面上的检测
    • typeof 1 //number
    • typeof 'a' //string
    • typeof null //object
    • null的类型是object,据说是计算机存储的一个bug
    • typeof f(){} //function
    • typeof {}, typeof []// object
  2. instanceof
    • 该运算符用于检测构造函数的原型属性书否出现在某个实例对象的原型链

    • 就是说看这个要检测的数据是什么原型,顺着原型链寻找;

      [] instanceof Array //true
      [] instanceof Object // true
      
    • 其缺点也比较明显一般只用于判断引用类型,而且结果也只能用布尔值判断,无法直接看出是什么类型,有时候判断基础类型还会不准确

      'abc' instanceof String//false
      //这种基本类型值判断建议使用typeof
      
    • 值得注意的是利用文字符号创建出来的字符串原形使用instanceof String,会找到undefined;

    • 使用new String构造的字符串,instanceof会等于String和Object

      ```javascript
      let string = new String('aaa');
      string instanceof String//true 
      string instanceof Object//true
      ```
      
    • String instanceof String//false,显然String是一个构造函数因此会等于Function和Object

    • Number instaceof Number //false 同上

      console.dirString//使用dir打印一下String函数
      String.__proto__.constructor//Function
      String.__proto__.__proto__.constructor//Object
      
  3. constructor
    • 直接输出需要检测的数据的构造函数

    • 这种方式十分准确,jquery是采用这种方式去判断类型的

      let arr = [];
      a.constructor.toString()
      "function Array() { [native code] }"
      let n = new Date()
      n.constructor.toString()
      "function Date() { [native code] }"
      "a".constructor.toString()
      "function String() { [native code] }"
      {}.constructor.toString()
      let a = {}
      a.constructor.toString()
      "function Object() { [native code] }"
      
      //jquery 中的实现方式,借助对象中的toString方法输出constructor
      	var class2type = {};
      	var toString = class2type.toString;//返回一个描述对象的字符串[object object]
      	//例如 toString.call([]) // [object array]
      "Boolean Number String Function Array Date RegExp Object Error Symbol".split(" ").forEach(function(item,i){
         class2type[`[object ${item}]`] = item.toLowerCase();
      });
      /**
      获得的class2type是:
      [object Array]: "array"
      [object Boolean]: "boolean"
      [object Date]: "date"
      [object Error]: "error"
      [object Function]: "function"
      [object Number]: "number"
      [object Object]: "object"
      [object RegExp]: "regexp"
      [object String]: "string"
      [object Symbol]: "symbol"
      */
      function toType(obj){
        if(obj == null){
          return obj + "";
        }
        //lass2type[toString.call(obj)]是要返回上面的class2type的映射
        return typeof obj === "object" || typeof obj === "function" ? 
          class2type[toString.call(obj)] || "object" : typeof obj
      }
      
  4. Object.prototype.toString.call('代检测的数据')

数据类型转换


待更新