js封装一个判断数据类型的函数

x33g5p2x  于2022-03-21 转载在 其他  
字(3.2k)|赞(0)|评价(0)|浏览(369)

一、写在前面
今天看到一道面试题——用js手写一个判断数据类型的函数。然后我首先想到的就是通过if....else if .....else if...,但是这样写就会给面试官感觉特别Low。那我们来看一下如何实现。
二、typeof
typeof操作符返回一个字符串(全小写字母),表示未经过计算的操作数的类型。

  1. console.log(typeof 1); //number
  2. console.log(typeof 1.11); //number
  3. console.log(typeof Math.PI); //number
  4. console.log(typeof Infinity); //number
  5. console.log(typeof NaN); //number
  6. console.log(typeof Number(1)); //number
  7. console.log(typeof ""); //string
  8. console.log(typeof "abc"); //string
  9. console.log(typeof "1"); //string
  10. console.log(typeof (typeof 1)); //string
  11. console.log(typeof String(1)); //string
  12. console.log(typeof false); //boolean
  13. console.log(typeof true); //boolean
  14. console.log(typeof Boolean(1)); //boolean
  15. console.log(typeof !!(1)); //boolean
  16. console.log(typeof Symbol()); //symbol
  17. console.log(typeof Symbol('foo')); //symbol
  18. console.log(typeof Symbol.iterator); //symbol
  19. console.log(typeof undefined); //undefined
  20. console.log(typeof function(){}); //function
  21. console.log(typeof class C{}); //function
  22. console.log(typeof Math.min); //function
  23. console.log(typeof {}); //object
  24. console.log(typeof null); //object
  25. console.log(typeof []); //object
  26. console.log(typeof new Date()); //object
  27. console.log(typeof new RegExp()); //object
  28. console.log(typeof new Boolean(true)) //object
  29. console.log(typeof new Number(1)) //object
  30. console.log(typeof new String('abc')) //object

三、instanceof
instanceof用来检测构造函数的prototype属性是否出现在某一个实例对象的原型链上。
语法: 实例对象 instanceof 构造函数

  1. console.log({} instanceof Object); //true
  2. console.log([] instanceof Array); //true
  3. console.log([] instanceof Object); //true
  4. console.log("123" instanceof String); //false 这里是因为'123'不是对象,而是原始值
  5. console.log(new String(123) instanceof String); //true 这里的new String(123)就是实例对象

instanceof函数的实现

  1. <script>
  2. function myInstanceof(left, right) {
  3. let proto = Object.getPrototypeOf(left)
  4. let prototype = right.prototype
  5. while (true) {
  6. if (!proto) return false
  7. if (proto === prototype) return true
  8. proto = Object.getPrototypeOf(proto)
  9. }
  10. }
  11. console.log(myInstanceof({}, Object)) //true
  12. console.log(myInstanceof("123", Array)) //false
  13. </script>

四、constructor
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数。
语法:object.constructor

  1. console.log(''.constructor === String) //true
  2. console.log(true.constructor === Boolean) //true
  3. console.log(new Number(1).constructor === Number) //true
  4. console.log(new Function().constructor === Function) //true
  5. console.log(new Date().constructor === Date) //true
  6. console.log(new Error().constructor === Error) //true
  7. console.log([].constructor === Array) //true
  8. console.log(document.constructor === HTMLDocument) //true
  9. console.log(window.constructor === Window) //true

五、Object.prototype.toString()
toString()是Object原型对象上的方法,返回的是代表该对象的字符串。
调用Object.prototype.toString方法返回的格式是[object Xxxx],其中Xxxx就是对象的类型。
而对于其他对象(Array、String、Number、Boolean、RegExp、Date等),则需要通过call、apply来调用才能返回正确的类型信息。
Object.prototype.toString()与Object.toString()的区别
Object.toString()的toString()是Object构造函数上的方法,返回的是对应的函数。
Object.prototype.toString()的toString()是Object原型对象上的方法,返回的是代表该对象的字符串。
具体如下图所示:
Object.toString()

  1. console.log(Object.toString([])) //function Object() { [native code] }

Object.prototype.toString()

  1. console.log(Object.prototype.toString({})) //[object Object]

六、最后我们进行封装

  1. function getStyle(data) {
  2. let type = typeof(data)
  3. if(type !=="object") {
  4. return type
  5. }
  6. return Object.prototype.toString.call(data).replace(/^\[object (\S+)\]$/, "$1")
  7. }

相关文章