阅读 67

js类型判断(js判断数据类型的方法及优缺点)

typeof

能够快速区分基本数据类型 缺点:不能将Object、Array和Null区分,都返回object

  1. typeof可以判断几种类型?

7种数据类型:`number、string、boolean、undefined、object、function` , 以及 `ES6` 新增的 `symbol` 复制代码

  1. typeof 能正确区分数据类型吗?

不能。对于原始类型,除 `null` 都可以正确判断;对于引用类型,除 `function` 外 都会返回 `"object"` 复制代码

  1. typeof 注意事项

  • typeof 返回值为 string 格式

  • typeof 未定义的变量不会报错,返回 "undefiend"

  • typeof(null) -> "object": 遗留已久的 bug

  • typeof无法区别数组与普通对象: typeof([]) -> "object"

  • typeof(NaN) -> "number"

  1. 列子

    typeof(1); //'number'     typeof('1'); // 'string'     typeof(false); // 'boolean'     typeof(undefined); // 'undefined'     typeof(null); // 'object'     typeof([]); // 'object'     typeof({}); // 'object'     typeof(() => {}); // 'function' 复制代码

instanceof

能够区分Array、Object和Function,适合用于判断自定义的类实例对象 缺点:Number,Boolean,String基本数据类型不能判断

语法

    object instanceof constructor 复制代码

参数

  • object

    某个实例对象

  • constructor

    某个构造函数

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

// 定义构造函数 function C(){} function D(){} var o = new C(); o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype o instanceof D; // false,因为 D.prototype 不在 o 的原型链上 o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true C.prototype instanceof Object // true,同上 C.prototype = {}; var o2 = new C(); o2 instanceof C; // true o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上. D.prototype = new C(); // 继承 var o3 = new D(); o3 instanceof D; // true o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上 复制代码

instanceof 常用来判断 A 是否为 B 的实例

Object.prototype.toString.call()

精准判断数据类型 缺点:写法繁琐不容易记,推荐进行封装后使用

toString.call(()=>{})       // [object Function] toString.call({})           // [object Object] toString.call([])           // [object Array] toString.call('')           // [object String] toString.call(22)           // [object Number] toString.call(undefined)    // [object undefined] toString.call(null)         // [object null] toString.call(new Date)     // [object Date] toString.call(Math)         // [object Math] toString.call(window)       // [object Window] 复制代码

封装

const getPrototype = (item) => {      const prototype = Object.prototype.toString.call(item).split(' ')[1].replace(']', '');       return prototype }


作者:逆风起飞
链接:https://juejin.cn/post/7028846451035897886


文章分类
代码人生
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐