js中的数据类型及判断

js数据类型有哪些

ECMAScript 规范中, 分为 基本类型引⽤类型 两⼤类,如下所示: 基本数据类型(值类型): 
  • number: NaN\Infinity\正常数字
    string: 正常字符串\模版字符串
    boolean: true\false
    null: 空 typeof null ==> "object"
    undefined: 未定义
    symbol: 唯一值 
    bigInt: 大数字
引用数据类型:  (对象数据类型)
  • 在js中Object是一个基类
    object:Object、Array、function、Date、RegExp。  

基本数据类型和引用数据类型的区别

基本类型  也称为简单类型,由于其占据空间固定,是简单的数据段,为了便于提升变量查询速度,将其 存储在栈中,即按值访问。 引⽤类型  也称为复杂类型,由于其值的⼤⼩会改变,所以不能将其存放在栈中,否则会降低变量查询速度,因此,其值存储在堆(heap) 中,⽽存储在变量处的值,是⼀个指针,指向存储对象的内存处,即按址访问。

堆栈内存

堆(内存) Heap 存储计算所用的数据 仓库

栈(内存) Stack 存贮计算过程空间 先进先出 先进后出

基本数据类型和引用数据类型在内存中的执行(图)

js中的数据类型及判断

 


js中常见的数据类型判断

  • typeof 只能判断基本数据类型(null==>object); 判断引用数据类型 都返回object
       let str = 'dhvd' 
       console.log(typeof(str)); //string

       let num = 123
       console.log(typeof(num)); //number

       let flag = false
       console.log(typeof(flag)); //boolean

       let s = Symbol('s')
       console.log(typeof(s)); //symbol

       let obj = {} 
       console.log(typeof(obj)); //object

       let arr = [] 
       console.log(typeof(arr)); //object
  • instanceof 只有知道数据类型才可以判断 语法: 要判断数据类型的变量 instanceof Array,返回结果为布尔值,true/false。
        [] instanceof Array;// true
        {} instanceof Object;// true
        new Date() instanceof Date;// true
        function Person() { };
        console.log(new Person() instanceof Person); 
        [] instanceof Object;// true
        new Date() instanceof Object;// true
        new Person instanceof Object;// true

        *由于Object 是 js 的一个基类,根据原型链的机制,[] instanceof Object; 也返回 true 。 

  • constructor 语法: 要判断数据类型的变量.constructor === Array
        console.log('数据类型判断' -  constructor);
        console.log(arr.constructor === Array); //true
        console.log(date.constructor === Date); //true
        console.log(fn.constructor === Function); //true

        *null 和 undefined 是⽆效的对象,因此是不会有 constructor 存在的。

  • Object.prototype.toString.call()  原生js最全能的数据类型判断 "[object 数据类型]"
        Object.prototype.toString.call(''); // [object String]
        Object.prototype.toString.call(1); // [object Number]
        Object.prototype.toString.call(true);// [object Boolean]
        Object.prototype.toString.call(Symbol());//[object Symbol]
        Object.prototype.toString.call(undefined);// [object Undefined]
        Object.prototype.toString.call(null);// [object Null]
        Object.prototype.toString.call(new Function());// [object Function]
        Object.prototype.toString.call(new Date());// [object Date]
        Object.prototype.toString.call([]);// [object Array]
        Object.prototype.toString.call(new RegExp());// [object RegExp]
        Object.prototype.toString.call(new Error());// [object Error]
        Object.prototype.toString.call(document);// [object HTMLDocument]
        Object.prototype.toString.call(window);//[object global] window 是全局对象global 的引⽤
  • Array.isArray()  数组API
  • Number.isNaN()  是不是 不是一个数 NaN ===> not a number


手写  Object.toType(a)  方法判断 js 数据类型

        // Object.toType(a) ==> "数据类型"
        function toType(data) {
            if (typeof data !== 'object') return typeof data;
            if (typeof data === 'object' && data == null) return 'null';
            let obj = {},
                type = obj.toString.call(data),
                result;
            type.replace(/\[object (\w+)\]/, (q, p) => {
                result = p.toLowerCase();
            })
            return result;
        }

上一篇:JavaScript判断是否为对象


下一篇:C#导出表格 多个sheet