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 相关文章推荐
jQuery 跨域访问问题解决方法
Dec 02 Javascript
基于jQuery的可以控制左右滚动及自动滚动效果的代码
Jul 25 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
Dec 12 Javascript
js判断undefined变量类型使用typeof
Jun 03 Javascript
Javascript中call与apply的学习笔记
Sep 22 Javascript
使用jquery.qrcode.js生成二维码插件
Oct 17 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
form表单数据封装成json格式并提交给服务器的实现方法
Dec 14 Javascript
微信小程序block的使用教程
Apr 01 Javascript
node.js遍历目录的方法示例
Aug 01 Javascript
微信小程序获取用户信息并保存登录状态详解
May 10 Javascript
vue eslint简要配置教程详解
Jul 26 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
PHP 翻页 实例代码
2009/08/07 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
Laravel5.4框架中视图共享数据的方法详解
2019/09/05 PHP
在TP5数据库中四个字段实现无限分类的示例
2019/10/18 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
JS实现动态无缝轮播
2020/01/11 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
python使用tornado实现登录和登出
2018/07/28 Python
python编程使用协程并发的优缺点
2018/09/20 Python
django和vue实现数据交互的方法
2019/08/21 Python
python生成器用法实例详解
2019/11/22 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
Python3监控疫情的完整代码
2020/02/20 Python
一款基于css3麻将筛子3D翻转特效的实例教程
2014/12/31 HTML / CSS
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
护士自我介绍信
2014/01/13 职场文书
迟到检讨书800字
2014/01/13 职场文书
三项教育活动实施方案
2014/03/30 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
房地产公司财务总监岗位职责
2015/04/03 职场文书
防汛通知
2015/04/25 职场文书
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
python的html标准库
2022/04/29 Python