当前位置: 首页 > news >正文

[转]如何判断js中的数据类型

原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html

如何判断js中的数据类型:typeof、instanceof、 constructor、 prototype方法比较

如何判断js中的类型呢,先举几个例子:

var a = "iamstring.";

var b = 222;

var c= [1,2,3];

var d = new Date();

var e = function(){alert(111);};

var f = function(){this.name="22";};

 

最常见的判断方法:typeof

alert(typeof a)   ------------> string

alert(typeof b)   ------------> number

alert(typeof c)   ------------> object

alert(typeof d)   ------------> object

alert(typeof e)   ------------> function

alert(typeof f)   ------------> function

其中typeof返回的类型都是字符串形式,需注意,例如:

alert(typeof a == "string") -------------> true

alert(typeof a == String) ---------------> false

另外typeof 可以判断function的类型;在判断除Object类型的对象时比较方便。

 

判断已知对象类型的方法: instanceof

alert(c instanceof Array) ---------------> true

alert(d instanceof Date) 

alert(f instanceof Function) ------------> true

alert(f instanceof function) ------------> false

注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

 

根据对象的constructor判断: constructor

alert(c.constructor === Array) ----------> true

alert(d.constructor === Date) -----------> true

alert(e.constructor === Function) -------> true

注意: constructor 在类继承时会出错

eg,

      function A(){};

      function B(){};

      A.prototype = new B(); //A继承自B

      var aObj = new A();

      alert(aobj.constructor === B) -----------> true;

      alert(aobj.constructor === A) -----------> false;

而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:

      alert(aobj instanceof B) ----------------> true;

      alert(aobj instanceof B) ----------------> true;

言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:

      aobj.constructor = A; //将自己的类赋值给对象的constructor属性

      alert(aobj.constructor === A) -----------> true;

      alert(aobj.constructor === B) -----------> false; //基类不会报true了;

 

通用但很繁琐的方法: prototype

alert(Object.prototype.toString.call(a) === ‘[object String]’) -------> true;

alert(Object.prototype.toString.call(b) === ‘[object Number]’) -------> true;

alert(Object.prototype.toString.call(c) === ‘[object Array]’) -------> true;

alert(Object.prototype.toString.call(d) === ‘[object Date]’) -------> true;

alert(Object.prototype.toString.call(e) === ‘[object Function]’) -------> true;

alert(Object.prototype.toString.call(f) === ‘[object Function]’) -------> true;

大小写不能写错,比较麻烦,但胜在通用。

通常情况下用typeof 判断就可以了,遇到预知Object类型的情况可以选用instanceof或constructor方法,简单总结下,挖个坑,欢迎补充!

相关文章:

  • 武汉Uber优步司机奖励政策(12月21日-12.27日)
  • Java基础学习总结(5)——多态
  • 【CURL】PHP的CURL开发项目最佳实践
  • WordPress 全方位优化指南(上)
  • 光播的一些属性设置
  • iOS Swizzle
  • 我的Python 学习之旅 从0开始的小白
  • excel文件怎么使用php进行处理
  • MongoDB常用命令
  • [MFC] VS2013版本MFC工程移植到VC6.0上
  • 关于APP,原生和H5开发技术的争论
  • CentOS7+Tomcat 生产系统部署
  • 只有明确目标和方向才能直冲云霄
  • 如何解决MathType特殊字符在InDesign中的这些问题
  • 【深入浅出Node.js系列二】Node.jsNPM的安装与配置
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • download使用浅析
  • If…else
  • Java多线程(4):使用线程池执行定时任务
  • Just for fun——迅速写完快速排序
  • Laravel Mix运行时关于es2015报错解决方案
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • PHP 的 SAPI 是个什么东西
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vultr 教程目录
  • Zsh 开发指南(第十四篇 文件读写)
  • 闭包--闭包作用之保存(一)
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 你真的知道 == 和 equals 的区别吗?
  • 微信公众号开发小记——5.python微信红包
  • 优秀架构师必须掌握的架构思维
  • 原生 js 实现移动端 Touch 滑动反弹
  • 正则表达式小结
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Semaphore
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (solr系列:一)使用tomcat部署solr服务
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (转)visual stdio 书签功能介绍
  • (转)用.Net的File控件上传文件的解决方案
  • .htaccess 强制https 单独排除某个目录
  • .jks文件(JAVA KeyStore)
  • .net 7 上传文件踩坑
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • ::什么意思
  • @Bean有哪些属性
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [C++基础]-初识模板
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [C语言]——分支和循环(4)