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