第一种:Object.prototype.toString()方法:

注意这里是Object原型对象上的toString方法才能判断,其他原型对象上的不能判断,如

Array原型对象上的toString方法是判断不了的,因为它重写了toString方法。

要使用Object原型对象上的toString方法进行数据类型判断,我们需要借助apply方法或者

call方法或者bind方法。

用法:

Object.prototype.toString.call(要判断类型的数据);
Object.prototype.toString.apply(要判断类型的数据);
Object.prototype.toString.bind(要判断类型的数据)();

如代码所示,三种调用都可以判断数据类型。这种判断数据类型的缺点就是判断不了自定义构造函数创建出来的实例对象:

 

如图所示,判断出来的不是Anamil,而是Object。

第二种:constructor属性

这个属性是用来判断某个实例对象是不是这个构造函数创建出来的。

我们来看一个图

这个是构造函数跟实例对象以及原型对象的关系,如果对这部分不熟悉,可以看我的另一篇博客,有讲解原型链的。

constructor之所以可以判断实例对象是不是这个构造函数的实例,是因为构造函数创建的时候,会有一个prototype属性指向原型对象,而原型对象中会有一个constructor属性指回来构造函数,

而实例对象会继承这个原型对象,所以我们可以

	function Anamil(name) {
		this.name = name
	}
	let ana1 = new Anamil('dog');
	function f(){}

	console.log('--------')
	console.dir(ana1.constructor == Anamil)
    console.dir(ana1.constructor == Object)
	console.log('--------')

第三种 instanceof运算符

用法  A  instanceof  B

instanceof运算符是用来判断B在不在A的原型链上,如果在,则返回true,如果一直找到原型链的尽头null都没找到,则返回false

第四种 typeof运算符

用法 typeof A

typeof运算符识别null的时候会返回Object,这个是是因为在js栈存储中,存储对象的时候,那个地址值是以000开头的,然后null是一个空,相当于就是全0,所以用typeof  来判断null的类型的时候,是会返回Object的,但实际上null是基本数据类型。

第五种 ==/===运算符

	let a = '';
	let b;
	console.log('--------')
	console.dir(a == undefined)
	console.dir(b === undefined)
	console.log('--------')

 

可以用来判断变量是不是undefined。

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐