ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

由typeof 检测出null是Object类型引发的一些列疑问?

2021-08-04 20:00:46  阅读:195  来源: 互联网

标签:instanceof console log Object 数据类型 typeof constructor null true


1.javaScirpt的数据类型有哪些?

基本数据类型:(5种)

  • Undefined
  • Null
  • Boolean
  • String
  • Number

引用数据类型:(1种)

  • Object
    (注意:array,function,object都属于Object)

Es6新增的数据类型:(1种)

  • symbol

2.常用的检测数据类型的方法有哪些呢?

typeof

  • typeof可以判断的类型: number、boolean、symbol、string、object、undefined、function
  • 优点: 可以区分function和object
  • 缺点:
  • type null 返回 object,可以理解为空对象,但其实我们想要的是Null
  • 数组(Array),日期(Date),正则(RegExp)都会返回object,但其实我们想要更加详细的区分 (检测null的类型是显示为object)
 		let m=null;   
  console.log(typeof m);//object

出现null检测为object原因:

在JS的最初版本中使用的是32位系统,为了性能考虑使用低位存储变量的类型信息,000开头的是对象,null是全0,所以将null误判为Object了,虽然现在的内部类型判断代码已经改变了,但bug永久的遗留下来了

 		let str="abcdefg";     
        let num=123;          
        let bol=true;              
        let n=undefined;   
        console.log(typeof str);//string
        console.log(typeof num);//number
        console.log(typeof bol);//boolean
        console.log(typeof n); //undefined

typeof检测引用数据类型

		let arr=[1,2,3]
        function show(){
            return "show"
        }
        let obj={
            name:"jack",
            age:"18"
        }

        console.log(typeof arr);//object
        console.log(typeof show);//function
        console.log(typeof obj);//object

instanceof

instanceof检测数据类型,可以用instanceof判断对象的正确类型,它的内部机制是通过原型链来判断的。

  • 功能: 用于判断两个对象是否属于实例关系(可以借此判断数据类型)
  • 缺点: 无法判断某一对象具体属于哪种类型
 //判断对象
        const Person=function(){};
        const p1=new Person();
        console.log(p1 instanceof Person);//true

        // 判断基本数据类型
        const str="string";
        console.log(str instanceof String);//false

        const num=123;
        console.log(num instanceof Number);//false

        const bol=false;
        console.log(bol instanceof Boolean);//false

        const sym=Symbol();
        console.log(sym instanceof Symbol);//false

        // 如何让instanceof检测基本数据类型呢?
        const num1=new Number(123);
        console.log(num1 instanceof Number);//true
        console.log(num1 instanceof Object);//true

        const str1=new String("abcdef");
        console.log(str1 instanceof String);//true
        console.log(num1 instanceof Object);//true

constructor

  • 功能: constructor是原型prototype的一个属性,可以通过一个对象的constructor属性比对对象的数据类型
  • 缺点: null 和 undefined 没有constructor
    false.constructor == Boolean;          // true
   "123".constructor == String;            // true
   new Number(123).constructor == Number;  // true
   [].constructor == Array;                // true
   new Function().constructor == Function; // true
   new Date().constructor == Date;         // true
   document.constructor == HTMLDocument;   // true
   window.constructor == Window;           // true
   new Error().constructor == Error;       // true

Object.prototype.toString.call()

  • 功能: toString() 是 Object 的原型方法,调用该方法,默认返回当前对象的 [[Class]]
   Object.prototype.toString.call('123') ;   // [object String]
   Object.prototype.toString.call(123) ;     // [object Number]
   Object.prototype.toString.call(false) ;   // [object Boolean]

3、小结

最常用的还是前面两种检测数据类型的方法,需要注意的是要区分这两种方法的利弊,用在合适的地方,typeof一般用在将基础的数据类型做一个简单的判断,instanceof一般是用在检测原型上面,其他两种方法做一个简单的了解即可!

标签:instanceof,console,log,Object,数据类型,typeof,constructor,null,true
来源: https://blog.csdn.net/Wsh20210301/article/details/119390847

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有