摘要
想必各位一定在面试中遇到这样的问题:
【1】JS中的数据类型都有哪些
【2】判断数据类型的方法有哪些
当你回答了typeof 和 instanceof 之后,面试官一定又会问:
那typeof 和 instanceof 的区别是什么,instanceof的原理是什么,可以简单实现一下吗?
你肯定知道,typeof是用来判断基本数据类型,而instanceof是用来判断引用数据类型。这个我们就不再赘述了。
如果你再看过一些面经或者文章,一定也知道instanceof的原理是什么。那我们如何用代码来将instanceof实现出来呢?
1.手写instanceof
我们先解释一下instanceof的原理:
当判断一个对象是否为一个类的实例时,我们会沿着对象的原型链一层层向上找,看是否有指向类的原型,直到原型链的尽头。
好像有点弯弯绕绕啊,那我们就换一种风格来解释:
当判断一个obj是否为一个class的实例时,我们会验证obj的__proto__一层层向上找,看是否有一个__proto__ === class 的 prototype。直到找到的__proto__ 为 null。
如果你理解了这一段话,那么instanceof的实现不就是手到擒来了吗!
只需要来一个while循环。
function _istanceof(obj, type) {if (typeof obj !== 'object' || obj === null) {return false;
}while (obj) {if (obj.__proto__ === type.prototype) {return true;}obj = obj.__proto__;
}return false;}
2.Object.prototype.toString.call()
一般如果面试官问到了这里,其实肯定还有一问等着你呢。
instanceof有什么问题吗,还有别的判断数据类型的方法吗
当我们知道了instanceof是通过原型链向上查找的原理后,就能理解其实他是有一些不稳定的,因为在原型链上某一节上出现了问题,就会导致判断类型的错误。
所以,有一种更为准确的方法来判断数据类型,甚至它能同时判断基本数据类型和引用数据类型。甚至它连null都可以识别出来。
他就是Object.prototype.toString.call()。
比如你想判断一下一个对象是否为数组类型只需要:
Object.prototype.toString.call([]) === '[object Array]';
同理,你也可以把其他的数据类型都试试。
最后,希望这一篇文章对你能有所帮助,笔芯❤️。