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 相关文章推荐
JQuery从头学起第三讲
Jul 06 Javascript
JS 各种网页尺寸判断实例方法
Apr 18 Javascript
使用jquery hover事件实现表格的隔行换色功能示例
Sep 03 Javascript
jQuery修改CSS伪元素属性的方法
Jul 30 Javascript
jQuery实现判断滚动条到底部
Jun 23 Javascript
实用又漂亮的BootstrapValidator表单验证插件
May 30 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
Oct 26 Javascript
微信小程序 页面传参实例详解
Nov 16 Javascript
原生JS实现的简单轮播图功能【适合新手】
Aug 17 Javascript
jQuery实现的自定义轮播图功能详解
Dec 28 jQuery
JS中的算法与数据结构之集合(Set)实例详解
Aug 20 Javascript
vue路由跳转传递参数的方式总结
May 10 Javascript
通过函数作用域和块级作用域看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
星际争霸秘籍
2020/03/04 星际争霸
深入解析php之sphinx
2013/05/15 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php fread读取文件注意事项
2016/09/24 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
2018/08/06 PHP
PHP7原生MySQL数据库操作实现代码
2020/07/03 PHP
超级兔子让浮动层消失的前因后果
2007/03/09 Javascript
js form action动态修改方法
2008/11/04 Javascript
起点页面传值js,有空研究学习下
2010/01/25 Javascript
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
基于LayUI分页和LayUI laypage分页的使用示例
2017/08/02 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
vue实现数据控制视图的原理解析
2020/01/07 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
2020/04/17 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
vue实现评价星星功能
2020/06/30 Javascript
vue界面发送表情的实现代码
2020/09/11 Javascript
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python 移动光标位置的方法
2019/01/20 Python
Python sorted排序方法如何实现
2020/03/31 Python
阿联酋手表和配饰购物网站:Rivolishop
2019/11/25 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
秘书专业自荐信范文
2013/12/26 职场文书
环保公益策划方案
2014/08/15 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
晋江市委常委班子四风问题整改工作方案
2014/10/26 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
超市采购员岗位职责
2015/04/07 职场文书
工作态度不好检讨书
2015/05/06 职场文书
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python