Js数据类型判断的四种方法

先说说数据的基本类型有什么

在JavaScript中数据类型分为:基本数据类型、引用数据类型、特殊类型

  • 基本数据类型:Number、String、Boolean
  • 引用数据类型:Object、Array、Function、Date、RegExp
  • 特殊类型:Unedfined、Null

有时候我们需要通过判断变量的数据类型来进行下一步操作,而我们常用的四种方法分别是:typeof、instanceof、constructor、Object.prototyep.toString

1.typeof

typeof 返回的是表示数据类型的字符串,返回结果包括:numberbooleanstringobjectundefinedfunctionbigintsymbol。他可以对Js基本数据类型做出正确的判断。

   typeof '123'     //  string
   typeof Symbol('1')   // symbol
   typeof 111n    //  bigint
   typeof {a:1,b:2}    // object
   typeof c     //  function
   typeof  '' ;  // string 有效
   typeof  1;  // number 有效
   typeof  true ;  //boolean 有效
   typeof  undefined;  //undefined 有效
   typeof  null ;  //object 无效
   typeof  [] ;  //object 无效
   typeof  new  Function();  // function 有效
   typeof  new  Date();  //object 无效
   typeof  new  RegExp();  //object 无效

2.instanceof
instanceof 检测的是原型 ,主要的作用就是判断一个实例是否属于某种类型,也可以判断一个实例是否是其父类型或者祖先类型的实例

	var arr = [1];
	var obj = {"1"};
	var str = "1";
	var num = 2;
	console.log(arr instanceof Array);  //  true  
	console.log(arr instanceof Object); //  true
	console.log(obj instanceof Object); //  true
	console.log(str instanceof String); //  false
 	console.log(num instanceof Number); //  false
	console.log(arr.__proto__.__proto__ === Object.prototype);
	console.log(arr.__proto__ === Array.prototype);
 	console.log(Object.prototype);
	console.log(Array.prototype);

为什么arr 都是true ,首先要了解insetanceof的定义,是用来测试一个对象在原型链上是否存在一个构造函数的prototype属性。每一个对象上都有一个__proto__属性,指向创建该对象的函数的peototype属性。instanceof的判断是通过 prototype 和 prpto 能否找到同一个引用对象。

3.constructor
当一个函数F被定义时,JS引擎会为F添加prototype原型,然后再在prototype上添加一个constructor属性,并让其指向F的引用。如下所示 :在这里插入图片描述
当执行 var f = new F() 时,F被当成了构造函数,f是F的实例对象,此时F原型上的constructor传递到了f上,因此f.constructor == F
在这里插入图片描述
当执行 var f = new F() 时,F被当成了构造函数,f是F的实例对象,此时F原型上的constructor传递到了f上,因此f.constructor == F
在这里插入图片描述
细节问题:

  • null和undefined是无效的对象,因此是不会有constructor存在的,这两种类型的数据需要通过typeof来判断。
  • JS对象的constructor是不稳定的,这个主要体现在自定义对象上,当开发者重写prototype后,原有的constructor会丢失,constructor会默认为Object

在这里插入图片描述
为什么变成了Object?

prototype被重新赋值的是一个{}, {}是new Object()的字面量,因此new Object()会将Object原型上的constructor传递给{},也就是Object本身。

因此,为了规范,在重写对象原型时一般都需要重新给constructor赋值,以保证实例对象的类型不被改写。

4、Object.prototype.toString
toString是Object原型对象上的一个方法,该方法默认返回其调用者的具体类型,更严格的讲,是toString运行时this指向的对象类型, 返回的类型格式为[object,xxx],xxx是具体的数据类型,其中包括:String,Number,Boolean,Undefined,Null,Function,Date,Array,RegExp,Error,HTMLDocument,… 基本上所有对象的类型都可以通过这个方法获取到。

	Object.prototype.toString.call(window) ;  //[object global] window是全局对象global的引用
	Object.prototype.toString.call(document) ;           // [object HTMLDocument]
	Object.prototype.toString.call( null ) ;             // [object Null]
	Object.prototype.toString.call( new  Function()) ;   // [object Function]
	Object.prototype.toString.call( new  Function()) ;   // [object Function]
	Object.prototype.toString.call( new  Date()) ;       // [object Date]
	Object.prototype.toString.call( new  RegExp()) ;     // [object RegExp]
	Object.prototype.toString.call( new  Error()) ;      // [object Error]
	Object.prototype.toString.call( '' ) ;   			 // [object String]
	Object.prototype.toString.call([]) ;  				 // [object Array]
	Object.prototype.toString.call( true ) ; 		     // [object Boolean]
	Object.prototype.toString.call(1) ;                  // [object Number]
  1. 需要注意的是,必须通过Object.prototype.toString.call来获取,而不能直接 new Date().toString()
  2. 从原型链的角度讲,所有对象的原型链最终都指向了Object, 按照JS变量查找规则,其他对象应该也可以直接访问到Object的toString方法,而事实上,大部分的对象都实现了自身的toString方法,这样就可能会导致Object的toString被终止查找,因此要用call来强制执行Object的toString方法。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值