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 相关文章推荐
JS实现点击图片在当前页面放大并可关闭的漂亮效果
Oct 18 Javascript
JavaScript限定图片显示大小的方法
Mar 11 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
Mar 04 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
Jun 21 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
Jul 11 Javascript
深入浅析knockout源码分析之订阅
Jul 12 Javascript
JS实现禁止鼠标右键的功能
Oct 15 Javascript
angular4模块中给标签添加背景图的实现方法
Sep 15 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
关于layui flow loading占位图的实现方法
Sep 21 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
Jan 08 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作的文本留言本的例子(二)
2006/10/09 PHP
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
PHP精确计算功能示例
2016/11/29 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
Vue封装Swiper实现图片轮播效果
2018/02/06 Javascript
Vue异步组件处理路由组件加载状态的解决方案
2018/09/07 Javascript
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python中常用的各种数据库操作模块和连接实例
2014/05/29 Python
python正则表达式中的括号匹配问题
2014/12/14 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
2017/08/24 Python
Python reversed函数及使用方法解析
2020/03/17 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
大学生自荐书范文
2013/12/10 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
校本课程教学计划
2015/01/19 职场文书
新闻稿怎么写
2015/07/18 职场文书
校运会广播稿
2015/08/19 职场文书
Windows10下安装MySQL8
2021/04/06 MySQL
Python制作动态字符画的源码
2021/08/04 Python
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js