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 相关文章推荐
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
Jun 15 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
XML、HTML、CSS与JS的区别整理
Feb 18 Javascript
JQuery 的跨域方法推荐_可跨任何网站
May 18 Javascript
使用jQuery制作Web页面遮罩层插件的实例教程
May 26 Javascript
浅谈javascript控制HTML5的全屏操控,浏览器兼容的问题
Oct 10 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
详解js删除数组中的指定元素
Oct 31 Javascript
微信小程序实现无限滚动列表
May 29 Javascript
使用kbone解决Vue项目同时支持小程序问题
Nov 08 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
Jan 26 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排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
jQuery根据ID获取input、checkbox、radio、select的示例
2014/08/11 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
python判断windows系统是32位还是64位的方法
2015/05/11 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python中p-value的实现方式
2019/12/16 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
初学者学习Python好还是Java好
2020/05/26 Python
Python如何执行精确的浮点数运算
2020/07/31 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
css3实现圆锥渐变conic-gradient效果
2020/02/12 HTML / CSS
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
澳大利亚网上书店:QBD
2021/01/09 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
团员个人的自我评价
2013/12/02 职场文书
党员思想汇报范文
2013/12/30 职场文书
交通安全寄语大全
2014/04/08 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
先进学校事迹材料
2014/12/30 职场文书