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 面向对象编程  function是方法(函数)
Sep 17 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
jQuery获取及设置表单input各种类型值的方法小结
May 24 Javascript
JavaScript中的this引用(推荐)
Aug 05 Javascript
JS控制TreeView的结点选择
Nov 11 Javascript
AngularJS ng-repeat指令及Ajax的应用实例分析
Jul 06 Javascript
AngularJS 应用模块化的使用
Apr 04 Javascript
js实现打字小游戏
Dec 17 Javascript
在vue项目中 实现定义全局变量 全局函数操作
Oct 26 Javascript
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 Javascript
pnpm对npm及yarn降维打击详解
Aug 05 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中去掉字符串首尾空格的方法
2012/05/19 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
laravel添加前台跳转成功页面示例
2019/10/22 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
Seajs源码详解分析
2019/04/02 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
JS如何监听div的resize事件详解
2020/12/03 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
python实现的一个p2p文件传输实例
2014/06/04 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
2016/05/03 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
python3人脸识别的两种方法
2019/04/25 Python
Python 寻找局部最高点的实现
2019/12/05 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
Python持续监听文件变化代码实例
2020/07/22 Python
序列化Python对象的方法
2020/08/01 Python
如何利用python进行时间序列分析
2020/08/04 Python
python的数学算法函数及公式用法
2020/11/18 Python
幼儿园区域活动总结
2014/05/08 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
培训班开班主持词
2015/07/02 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
MySQL通过binlog恢复数据
2021/05/27 MySQL
Python Matplotlib绘制动画的代码详解
2022/05/30 Python