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 相关文章推荐
JavaScript高级程序设计(第3版)学习笔记 概述
Oct 11 Javascript
在JS数组特定索引处指定位置插入元素
Jul 27 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
全面解析Bootstrap图片轮播效果
Dec 03 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
Jun 01 Javascript
Bootstrap基本模板的使用和理解1
Dec 14 Javascript
Vue中的vue-resource示例详解
Nov 02 Javascript
Vue.Draggable拖拽功能的配置使用方法
Jul 29 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
Apr 09 Javascript
浅谈layui 表单元素的选中问题
Oct 25 Javascript
微信小程序复选框实现多选一功能过程解析
Feb 14 Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 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
PHP队列用法实例
2014/11/05 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
2015/12/31 PHP
简单PHP会话(session)说明介绍
2016/08/21 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
基于jquery的表格排序
2010/09/11 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
javascript判断ie浏览器6/7版本加载不同样式表的实现代码
2011/12/26 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
vue.js实现备忘录demo
2019/06/26 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
在vue中使用console.log无效的解决
2020/08/09 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
Python入门篇之数字
2014/10/20 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
2019/08/13 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Python log模块logging记录打印用法解析
2020/01/20 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Python如何发送与接收大型数组
2020/08/07 Python
css3.0新属性效果在ie下的解决方案
2010/05/10 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
大型车展策划方案
2014/02/01 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
环保守法证明
2015/06/24 职场文书
2015年社区消防安全工作总结
2015/10/14 职场文书
因个人工作失误检讨书
2019/06/21 职场文书