博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我所知道的JavaScript中判断数据类型
阅读量:7196 次
发布时间:2019-06-29

本文共 2073 字,大约阅读时间需要 6 分钟。

相信一提到怎么判断js的数据类型,大家都会想到的是typeof、instanceof,那么为什么有了typeof的存在还要有instanceof?

typeof?

根据MDN:typeof操作符返回一个字符串,表示未经计算的操作数的类型。

eg:

typeof 1; // 'number'typeof NaN; // 'number'typeof 'zenquan'; // 'string'typeof true; // 'boolean'typeof null; // 'object'typeof undefined; // 'undefined'typeof Symbol(); // 'symbol'typeof console.log // "function"复制代码

typeof出现的问题1——typeof null === 'object'

然后你会发现,typeof null; // 'object'。null可是原始数据类型的啊,怎么就是'object'了呢??(不解.jpg)原来这个已经是历史问题了,在 JS 的最初版本中使用的是 32 位系统,为了性能考虑使用低位存储变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。

typeof出现的问题2——typeof 引用类型 || Math === ‘object’

这样根本不知道是数组还是对象

typeof [] // "object"typeof {} // "object"复制代码

typeof出现的问题3——typeof 基本包装类型 || Array ||Date === ‘funtion’

这样也不能知道是Number还是Boolean还是String

typeof Number // "function"typeof Boolean // "function"typeof String // "function"复制代码

instanceof?

因为typeof有了以上的问题,所以才有了instanceof。

根据MDN:instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置

也就是 p instaceof person === true,则p是person的实例化对象,用于包装对象或者是引用类型对象的判断。

var str1 = 'zenquan';console.log(str1 instanceof String); // falsevar str2 = new String('jomsou');console.log(str2 instanceof String); // true复制代码

可能会出现的面试题: 如何判断一个数组?

方法1: instanceof

arr instanceof Array复制代码

方法2: Array.isArray()

Array.isArray([])复制代码

结合typeof和instanceof实现判断是否为原始类型

class PrimitiveString {    static [Symbol.hasInstance](x) {        return typeof(x) == 'string';    }}console.log('hello world' instanceof PrimitiveString);复制代码

你可能不知道 Symbol.hasInstance 是什么东西,其实就是一个能让我们自定义 instanceof 行为的东西,以上代码等同于 typeof 'hello world' === 'string',所以结果自然是 true 了。这其实也侧面反映了一个问题, instanceof 也不是百分之百可信的。

判断数据类型的方法

  1. Object.prototype.toString.call(e).slice(8, -1)
function type(e) {    return Object.prototype.toString.call(e).slice(8, -1);}console.log(type(null))console.log(type(1))console.log(type('zenquan'))console.log(type(undefined))console.log(type(Symbol()))console.log(type(true))console.log(type(console.log))复制代码
  1. : JS类型检测库,弥补typeof的问题,原生兼容IE6
  2. 通过一些系统自带的API函数来判断,eg: Array.isArray()

所以,typeof和instanceof结合起来就可以数据类型的判断。

转载地址:http://wmzum.baihongyu.com/

你可能感兴趣的文章
ios-网址中的中文或者非法字符转换
查看>>
自定义通知与系统通知的学习(详解)
查看>>
我的程序员之路(一)
查看>>
Spring思维导图,让Spring不再难懂(ioc篇)
查看>>
JVM调优之:内存分配参数
查看>>
webpack CSS LESS
查看>>
设计模式——模板方法模式
查看>>
eqweqe23
查看>>
面向对象
查看>>
javascript 添加事件兼容性处理
查看>>
Linux 目录卡死
查看>>
微服务框架Spring Cloud之使用事件和消息队列实现分布式事务
查看>>
碉堡了Ubuntu Core Linux支持 TS-4900 物联网开发板
查看>>
如何在多Kubernetes集群和多租户环境中使用Prometheus监控
查看>>
Thymeleaf教程 (十) 属性的优先级列表
查看>>
linux中 vi / vim显示行号或取消行号命令
查看>>
Python学习笔记 - 02: 用Python Client连接ElasticSearch操作数据
查看>>
2018年前端开发回顾
查看>>
微信小程序访问webService(Java)
查看>>
QT从QObject实现多重继承
查看>>