判断数据类型方法及区别

1.typeof

返回表示数据类型的字符串。

一般用来判断基本数据类型(但判断null类型是返回object),typeof 目前能返回string,number,boolean,symbol(ES6新增基本数据类型,表示独一无二的值,使用 symbol 作为属性名可以保证不会出现同名属性),bigint(es10新增一种基本数据类型,BigInt 可以表示任意大的整数,整数溢出将不再是问题。),unfined,object,function这八种判断类型。

typeof 运算符的问题是无论引用的对象是什么类型,它都返回object

2.instanceof

返回布尔值。

一般用来检测引用数据类型,如:Object,Function,Array,Date,RegExp等。

A instanceof B 判断A是否是B的实例,根本就是判断B.protoytpe是否在A的原型链上,所以无法判断具体是哪一种数据类型,arr instanceof Object=true,arr instanceof Array=true。

实现instanceof:

function instance_of(L, R) {         // L 表示instanceof左边,R 表示instanceof右边
		let O = R.prototype;         // 取 R 的显示原型
		L = L.__proto__;             // 取 L 的隐式原型
		while (true) {               // 循环执行,直到 O 严格等于 L
			if (L === null) return false;
			if (O === L) return true;
			L = L.__proto__;
		}
	}

3.Object.prototype.toString.call()

返回为[object,xxx]格式的字符串,xxx即判断数据的具体类型。

基本上所有对象的类型都可以通过这个方法获取到。

使用Object.prototype.toString.call()的方式来判断一个变量的类型是最准确的方法。

原理:每一个继承 Object 的对象都有 toString 方法,如果 toString 方法没有重写的话,会返回 [Object type],其中 type 为对象的类型。但当除了 Object 类型的对象外,其他类型直接使用 toString 方法时,会直接返回都是内容的字符串,所以我们需要使用call或者apply方法来改变toString方法的执行上下文

4.constructor

constructor是原型对象的属性,指向构造函数。a.constructor==b。判断b是不是a的构造函数。

null和undefined是无效的对象,因此是不会有constructor存在的,所以constructor判断不了这两种类型。

JS对象的constructor是不稳定的,当开发者重写prototype后,原有的constructor会丢失,constructor会默认为Object

undefined和null的区别

 当声明的变量还未被初始化时,变量的默认值为undefined。

null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象。

null表示"没有对象",即该处不应该有值。典型用法是:

(1) 作为函数的参数,表示该函数的参数不是对象。

(2) 作为对象原型链的终点。

undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:

(1)变量被声明了,但没有赋值时,就等于undefined。

(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。

(3)对象没有赋值的属性,该属性的值为undefined。

(4)函数没有返回值时,默认返回undefined。

判断一个变量是不是数组

1.arr instanceof Array

2.Object.prototype.toString.call(arr)

3.arr.constructor==Array

4.Array.isArray(arr)

5.arr.__proto__ === Array.prototype

6.Object.getPrototypeOf(arr) === Array.prototype

Object.getPrototypeOf() 方法返回指定对象的原型

7.Array.prototype.isPrototypeOf(arr)

用于测试一个对象是否存在于另一个对象arr的原型链上.

原型原型链:
在JavaScript中,每当定义一个函数数据类型(普通函数、类)时候,都会自带一个prototype属性,
这个属性指向函数的原型对象,并且这个属性是一个对象数据类型的值。
对象之间的继承关系,在JavaScript中是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条
当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,
如果没有则会去原型对象中寻找,如果找到则直接使用。如果没有则去原型的原型中寻找,直到找到Object对象的原型,Object对象的原型没有原型
可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性;使用in检查对象中是否含有某个属性时,
如果对象中没有但是原型中有,也会返回true
function Person() {}
Person.prototype.a = 123;
console.log(person.hasOwnProperty('a'));//false
console.log('a'in person)//true

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值