js数据类型检测总结


Posted in Javascript onAugust 05, 2018

在js中,有四种用于检测数据类型的方式,分别是:

  • typeof

    用来检测数据类型的运算符

  • instanceof

    检测一个实例是否属于某个类

  • constructor

    构造函数

  • Object.prototype.toString.call()

    原型链上的Object对象的toString方法

下面我们就来分别介绍一下上面四种方法的适用场景和局限性。

typeof 用来检测数据类型的运算符

使用typeof检测数据类型,返回值是字符串格式。能够返回的数据类型

是:"number","string","bolean","undefined","function","object"。

<script>
  console.log(typeof(1));  //number
  console.log(typeof('hello'));  //string
  console.log(typeof(true));  //boolean
  console.log(typeof(undefined));  //undefined
  console.log(typeof(null));  //object
  console.log(typeof({}));  //object
  console.log(typeof(function() {}));  //function
</script>

局限性:

  • typeof (null); //"object"。这是由于在js中,null值表示一个空对象指针,而这也正是使用typeof操作 符检测null值时会返回"object"的原因。
  • 不能具体的细分是数组还是正则,还是对象中其他的值,因为使用typeof检测数据类型,对于对象数据类型的所有的值,最后返回的都是"object"

instanceof 检测某一个实例是否属于某个类

instanceof主要用来弥补typeof不能检测具体属于哪个对象的局限性。

<script>
  let arr = [1,2,3];
  let reg = /\w/;
  console.log(arr instanceof Array);  //true
  console.log(arr instanceof Object);  //true
  console.log(reg instanceof RegExp);  //true
  console.log(reg instanceof Object);  //true
</script>

局限性:

  • 不能用于检测和处理字面量方式创建出来的基本数据类型值,即原始数据类型
  • instanceof的特性:只要在当前实例的原型链上的对象,我们用其检测出来都为true
  • 在类的原型继承中,我们最后检测出来的结果未必正确

constructor 构造函数

是函数原型上的属性,该属性指向的是构造函数本身。

作用和instsnceof非常相似,与instanceof不同的是,不仅可以处理引用数据类型,还可以处理原始数据类型。

<script>
  let num = 12;
  let obj = {};
  console.log(num.constructor == Number);//true
  console.log(obj.constructor == Object);//true
</script>

但是要注意一点的是,当直接用(对象字面量或原始数据).constructor时,最好加上()。为了便于理解,我们来看一个例子。

<script>
  1.constructor === Number;    //报错,Invalid or unexceped token
  (1).constructor === Number;    //true
  {}.constructor === Number;    //报错,Invalid or unexceped token
  ({}).constructor === Number;  //true
</script>

这主要是由于js内部解析方式造成的,js会把1.constructor解析成小数,这显然是不合理的,小数点后应该是数字,因此就会引发报错。js会把{}解析成语句块来执行,这时后面出现一个小数点显然也是不合理的,因此也会报错。为了解决这个问题,我们可以为表达式加上()使js能够正确解析。

局限性:我们可以把类的原型进行重写,在重写的过程中很可能把之前constructor给覆盖了,这样检测出来的结果就是不准确的

<script>
   function Fn() {};
  Fn.prototype = new Array;
  var f = new Fn;
  //f是一个函数,按道理说他的构造函数应该是Function,但是修改其原型链后,它的constructor变成了Array.
  console.log(f.constructor == Array);  //true
</script>

Object.prototype.toString.call() 原型链上的Object对象的toString方法

Object.prototype.toString的作用是返回当前方法的执行主体(方法中的this)所属类的详细信息,是最全面也是最常用的检测数据类型的方式。

返回值的类型为string类型。

<script> 
  console.log(Object.prototype.toString.call(1));          //[object Number]
  console.log(Object.prototype.toString.call(/^sf/));        //[object RegExp]
  console.log(Object.prototype.toString.call("hello"));      //[object String]
  console.log(Object.prototype.toString.call(true));        //[object Boolean]
  console.log(Object.prototype.toString.call(null));        //[object Null]
  console.log(Object.prototype.toString.call(undefined));      //[object Undefined]
  console.log(Object.prototype.toString.call(function() {}));    //[object Function]
  console.log(typeof(Object.prototype.toString.call(function() {})));    //string
</script>
Javascript 相关文章推荐
Extjs入门之动态加载树代码
Apr 09 Javascript
jquery如何把参数列严格转换成数组实现思路
Apr 01 Javascript
jquery parent和parents的区别分析
Oct 02 Javascript
js数组依据下标删除元素
Apr 14 Javascript
微信小程序 触控事件详细介绍
Oct 17 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
Apr 18 Javascript
微信小程序 request接口的封装实例代码
Apr 26 Javascript
浅谈JavaScript面向对象--继承
Mar 20 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
Feb 27 Javascript
Vue项目打包压缩的实现(让页面更快响应)
Mar 10 Javascript
vue-model实现简易计算器
Aug 17 Javascript
vue-cropper插件实现图片截取上传组件封装
May 27 Vue.js
通过函数作用域和块级作用域看javascript的作用域链
Aug 05 #Javascript
vue实现简单的MVVM框架
Aug 05 #Javascript
使用D3.js+Vue实现一个简单的柱形图
Aug 05 #Javascript
详解Require.js与Sea.js的区别
Aug 05 #Javascript
vue中关闭eslint的方法分析
Aug 04 #Javascript
详解Vue取消eslint语法限制
Aug 04 #Javascript
JavaScript原型对象、构造函数和实例对象功能与用法详解
Aug 04 #Javascript
You might like
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
php版微信开发Token验证失败或请求URL超时问题的解决方法
2016/09/23 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
使用隐藏的new来创建对象
2011/03/29 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
元素全屏的设置与监听实例
2017/11/28 Javascript
使用webpack搭建react开发环境的方法
2018/05/15 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
Python的内存泄漏及gc模块的使用分析
2014/07/16 Python
python实现K最近邻算法
2018/01/29 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
pandas中apply和transform方法的性能比较及区别介绍
2018/10/30 Python
python配置文件写入过程详解
2019/10/19 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
MCAKE蛋糕官方网站:一直都是巴黎的味道
2018/02/06 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
饭店工作计划书
2014/01/10 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
高中军训的心得体会
2014/09/01 职场文书
干部作风整顿自我剖析材料和整改措施
2014/09/18 职场文书
会计试用期自我评价
2014/09/19 职场文书
党的群众路线教育实践活动查摆问题自查报告
2014/10/10 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
详解MySQL连接挂死的原因
2021/05/18 MySQL
分布式Redis Cluster集群搭建与Redis基本用法
2022/02/24 Redis
alibaba seata服务端具体实现
2022/02/24 Java/Android