js数据类型及数据类型检测

js数据类型和js数据类型检测

一.js数据类型

js数据类型主要分为俩种:一种是基本数据类型,一种是引用数据类型

1.基本数据类型

其中基本数据类型包括:Number,String,Boolean,undefined,null等
基本数据类型是存储在栈中。

2.引用数据类型

其中包括Object,Function,Array等。
引用数据类型是存储在堆中。
注意:Function,Array也是一种Object。算是特殊的对象。

3.ES6新增数据类型

  • Symbol 和 BigInt 是ES6 中新增的数据类型:
  • Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
  • BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。

二.js数据类型检测

js数据类型检测主要有四种办法

首先定义好所有的数据类型:

        let a = 1; 
        let b = '1';
        let c = undefined
        let d = true
        let f = null
        let obj = Object.create({})
        let obj1 = {};
        let arr = new Array();
        let arr1 = [1];
        let fun = function () {
            console.log("dd");
        }
        let sym = Symbol('您好');
        let bgin = 100n;

1. typeof

*typeof() **实现原理:利用计算机二进制值来进行检测,检测速度很快
判断不出null、obj和数组类型,均返回object

      console.log(typeof (a)); //number
      console.log(typeof (b)); //string
      console.log(typeof (c));//undefined
      console.log(typeof (d));//boolean
      console.log(typeof (f));//object
      console.log(typeof (obj));//object
      console.log(typeof (obj1));//object
      console.log(typeof (arr));//object
      console.log(typeof (fun));//function
      console.log(typeof (sym));//symbol
      console.log(typeof (bgin));//bigint
      //判断不出null、obj和数组类型,均返回object

2.instanceof

*instanceof 判断数据类型 **按照原型链进行查找检测的「如果当前类的原型对象,出现在检测值的原型链上,则结果是true」
(1).检测对象是否为Object实例,结果都是true,所以无法验证是否为标准普通对象
(2).instanceof无法处理原始值类型的检测的,检测结果都是false

      console.log(a instanceof Number); //false
      console.log(new Number() instanceof Number); //true
      console.log(b instanceof String);//false
      console.log(f instanceof Object);//false
      console.log(obj instanceof Object);//true
      console.log(arr1 instanceof Object);//true
      console.log(arr instanceof Array);//true
      console.log(fun instanceof Function); //true
      // console.log(sym instanceof Object);//true
      // console.log(bgin instanceof BigInt); //true

3. constructor

constructor 原理是找该变量得原型对象上得构造函数,从而判读数据类型
因为constructor很容易被修改,所以检测的结果“仅供参考”
undefined和null值均判断不了,因为会报错,没有constructor属性

        console.log(a.__proto__); //Number
        console.log(sym.constructor);//ƒ Symbol() { [native code] }
        console.log(a.constructor == Number); //true
        console.log(b.constructor == String); //true
        console.log(d.constructor == Boolean); //true
        console.log(obj.constructor == Object);//true
        obj.constructor = Function; 
        console.log("修改构造函数");
//注意这里修改了obj的构造函数,指向了function,在次进行obj.constructor == Object  时返回false
        console.log(obj.constructor == Object);//false
        console.log(arr.constructor == Array);//true
        console.log(fun.constructor == Function);//true
        console.log(sym.constructor == Symbol);//true
        console.log(bgin.constructor == BigInt);//true

4.Object.prototype.toString.call()

object.prototype.toString.call() 原理是修改对象上得this指向到该变量,然后toString输出出来
所有数据类型均可以精准判断出来

      const toString = Object.prototype.toString;
      console.log(Object.prototype.toString(d));
       //[object Object] 这里展示了正常object的tostring方法是输出自己的构造函数
      console.log(toString.call(a)); //[object Number]
      console.log(toString.call(b));//[object String]
      console.log(toString.call(c));//[object Undefined]
      console.log(toString.call(d));//[object Boolean]
      console.log(toString.call(f)); //[object Null]
      console.log(toString.call(obj));//[object Object]   
      console.log(toString.call(arr));//[object Array]
      console.log(toString.call(fun));//[object Function]
      console.log(toString.call(sym));//[object Symbol]
      console.log(toString.call(bgin));//[object BigInt]

你可能感兴趣的:(javascript,前端,开发语言)