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静态作用域的功能。
Dec 25 Javascript
js防止页面被iframe调用的方法
Oct 30 Javascript
15个jquery常用方法、小技巧分享
Jan 13 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
javascript面向对象程序设计高级特性经典教程(值得收藏)
May 19 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
微信小程序 navigation API实例详解
Oct 02 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
使用Vuex实现一个笔记应用的方法
Mar 13 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 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编写大型网站问题集
2007/03/06 PHP
PHP IF ELSE简化/三元一次式的使用
2011/08/22 PHP
PHP的自定义模板引擎
2017/03/24 PHP
javascript 上下banner替换具体实现
2013/11/14 Javascript
javascript验证邮件地址和MX记录的方法
2015/06/16 Javascript
基于jQuery实现仿QQ空间送礼物功能代码
2016/05/24 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
jQuery与js实现颜色渐变的方法
2016/12/30 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
JS中使用media实现响应式布局
2017/08/04 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
详解JavaScript对数组操作(添加/删除/截取/排序/倒序)
2019/04/28 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
JS实现躲避粒子小游戏
2020/06/18 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
python三元运算符实现方法
2013/12/17 Python
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
python实现邮件自动发送
2019/08/10 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
2014年个人思想工作总结
2014/11/27 职场文书
个人廉政承诺书
2015/04/28 职场文书
2015年人事专员工作总结
2015/04/29 职场文书
法制教育主题班会
2015/08/13 职场文书