[前端] JavaScript数据类型检测实现方法详解

2015 0
王子 2022-11-8 08:28:27 | 显示全部楼层 |阅读模式
目录

    一、typeof二、instanceof三、Object.prototype.toString.call()面试问题


一、typeof

    优点:能快速判断基本数据类型,除了 Null;缺点:不能判别 Object、Array、Null ,都返回 object;判别引用类型除函数显示 function外,其他显示为 object
  1. console.log(typeof 55);              // number
  2. console.log(typeof true);            // boolean
  3. console.log(typeof 'aa');            // string
  4. console.log(typeof undefined);       // undefined
  5. console.log(typeof function(){});    // function
  6. console.log(typeof Symbol("foo"));   // symbol
  7. console.log(typeof 553119869n);      // bigint
  8. // 不能判别
  9. console.log(typeof []);   // object
  10. console.log(typeof {});   // object
  11. console.log(typeof null); // object
复制代码
二、instanceof

MDN:
instanceof 运算符 用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
理解:判断在其原型链中能否找到该类型的原型。
语法:
object instanceof constructor
  1. function D(){}
  2. var o = new D();
  3. o instanceof D;  // true
  4. o instanceof Object; // true
复制代码
    优点:能区分Array、Object和 Function,适用于判断自定义的类实例对象缺点:不能判断 Number,Boolean,String 基本数据类型
  1. console.log(55 instanceof Number);                // false
  2. console.log(true instanceof Boolean);             // false
  3. console.log('aa' instanceof String);              // false  
  4. console.log([] instanceof Array);                 // true
  5. console.log(function(){} instanceof Function);    // true
  6. console.log({} instanceof Object);                // true
复制代码
String 对象和 Date 对象都属于 Object 类型 和 一些特殊情况:
  1. var simpleStr = "a simple string";
  2. var objStr = new String();
  3. var newStr = new String("String created with constructor");
  4. var aDate = new Date();
  5. var myNonObj = Object.create(null);
  6. simpleStr instanceof String; // false,非对象实例,因此返回 false
  7. objStr instanceof String;    // true
  8. newStr instanceof String;    // true
  9. objStr instanceof Object;    // true      
  10. myNonObj instanceof Object; // false,一种创建非 Object 实例的对象的方法
  11. aDate instanceof Date;      // true
  12. aDate instanceof Object;    // true
复制代码
三、Object.prototype.toString.call()

    优点:精准判断数据类型,所有原始数据类型都是能判断;缺点:写法繁琐,最好进行封装后使用
  1. var toString = Object.prototype.toString;
  2. console.log(toString.call(55));           // [object Number]
  3. console.log(toString.call(true));         // [object Boolean]
  4. console.log(toString.call('aa'));         // [object String]
  5. console.log(toString.call([]));           // [object Array]
  6. console.log(toString.call(function(){})); // [object Function]
  7. console.log(toString.call({}));           // [object Object]
  8. console.log(toString.call(undefined));    // [object Undefined]
  9. console.log(toString.call(null));         // [object Null]
  10. console.log(toString.call(Math));         // [object Math]
  11. console.log(toString.call(Set));          // [object Function] Set 构造函数
  12. console.log(toString.call(Array));        // [object Function] Array 构造函数
  13. console.log(toString.call(Map));          // [object Function]
  14. console.log(toString.call(Date));         // [object Function]
  15. console.log(toString.call(new Set()));    // [object Set]
  16. console.log(toString.call(new Array()));  // [object Array]
  17. console.log(toString.call(new Map()));    // [object Map]
  18. console.log(toString.call(new Date()));   // [object Date]
  19. function D(){}
  20. console.log(toString.call(D));            // [object Function]
  21. console.log(toString.call(new D()));      // [object Object]
复制代码
面试问题

如何判断变量是否为数组?
  1. let arr = []
  2. console.log(Array.isArray(arr));    // true
  3. arr.__proto__ === Array.prototype;  // true
  4. arr instanceof Array;               // true
  5. Object.prototype.toString.call(arr);// [object Array]
复制代码
判断是否是 Promise 对象
  1. function isPromise(val) {
  2.   return (
  3.     typeof val.then === 'function' &&
  4.     typeof val.catch === 'function'
  5.   )
  6. }
  7. let p = new Promise((resolve, reject) => {});
  8. console.log(isPromise(p)); // true
复制代码
到此这篇关于JavaScript数据类型检测实现方法详解的文章就介绍到这了,更多相关JS数据类型检测内容请搜索中国红客联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持中国红客联盟!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行