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的区别

typescript 中判断非空 typeof判断数据类型_字符串

 当声明的变量还未被初始化时,变量的默认值为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