js数据类型判断

本文深入探讨JavaScript中数据类型的判别方法,包括typeof、instanceof、constructor及Object.prototype.toString.call(),并分析每种方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先js的数据类型有:

  1. 基本类型:string、number、boolean、null、undefined

  2. 引用类型/复杂类型:Object、Array、Error、Date、RegExp、Function

目前判断数据类型有以下几种方法:

  1. typeof

  2. instanceof

  3. constructor

  4. Object.prototype.toString.call()

下面来详细说一下这几种方法:

  • typeof

    function printIn(val) {
      console.log(typeof val);
    }
    printIn(''); // string
    printIn(1); // number
    printIn(true); // boolean
    printIn(null); // object
    printIn(undefined); // undefined
    printIn({}); // object
    printIn([]); // object
    printIn(function(){}); // function
    printIn(new RegExp()); // object
    printIn(new Date()); // object
    printIn(new Error()); // object复制代码

    总结一下:

    • 基本类型:除了null,全都能返回数据的准确类型

    • 引用类型:除了function,全都返回object,都不能返回数据的准确类型

    • null 返回object

    • function 返回 function

    显而易见这不是我们想要的。

  • instanceof
    instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置
    用法:A instanceof B.
    原理:判断B的prototype是否出现在对象A的原型链中的任何地方,简单的理解为:判断A是否是B的实例。
    var _date = new Date();     
    var _err = new Error();
    function Person() {}
    var _p = new Person();
       
    console.log({} instanceof Object); // true;
    console.log([] instanceof Array); // true;
    console.log(_date instanceof Date); // true;
    console.log(_err instanceof Error); // true;
    console.log(_p instanceof Person); // true;
    复制代码

     现在我们稍微修改一下代码:

    var _date = new Date();
    var _err = new Error();
    function Person() {}
    var _p = new Person();
       
    console.log({} instanceof Object); // true;
    console.log([] instanceof Object); // true;
    console.log(_date instanceof Object); // true;
    console.log(_err instanceof Object); // true;
    console.log(_p instanceof Object); // true;复制代码

    上面几种类型instanceof Object 都返回true,根据instanceof的原理所述,出现这样的情况并不难理解。有关原型和原型链方面的知识。
    所以我们不难得出instanceof的不足之处:
      1.instanceof 不适用于基本类型,只能用于引用类型。
      2.
    instanceof能判断出两者之间是否属于实例关系,但是不能判断出到底属于是那种类型

  • constructor

    function Person() {};
    var _p = new Person();
    var _obj = {};
    var _num = new Number(1);
    console.log(''.constructor === String); //true
    console.log(true.constructor === Boolean); //true
    console.log(_num.constructor === Number); //true
    console.log([].constructor === Array); //true
    console.log(_obj.constructor === Object); //true
    console.log(_p.constructor === Person); //true
    
    复制代码

    了解过原型的同学都知道 constructor 值指向构造函数本身的,所以可以根据constructor来判断实例具体是属于哪个数据类型的;
    现在来修改一下代码:

    function Person() {};
    Person.prototype = {}
    var _p = new Person();
    console.log(_p.constructor === Person)
    复制代码

    上面的代码可知,但用户手动的修改构造函数的prototype对象之后,实例的constructor变不指向该构造函数了;
    所以constructor存在的问题:
      1.由于null 和 undefined是无效的对象,所以是不会有constructor的。
      2.当重写构造函数的原型对象后,原有的constructor指向便不存在了,都默认指向Object
    所以在实际开发中,当重写了prototype对象之后,都需要重新指定constructor;

  • Object.prototype.toString.call()
    返回值:"[object XXXX]"

    function printIn(val){
      console.log(Object.prototype.toString.call(val));
    }
    printIn(''); //[object String]
    printIn(1); //[object Number]
    printIn(true); //[object Boolean]
    printIn(null); //[object Null]
    printIn(undefined); //[object Undefined]
    printIn([]); //[object Array]
    printIn({}); //[object Object]
    printIn(new Date()); //[object Date]
    printIn(new Error()); //[object Error]复制代码

      个人喜欢用该方法判断对象类型;


转载于:https://juejin.im/post/5c345f796fb9a049cd545f15

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值