浅谈js数据类型识别方法
js有6种基本数据类型 Undefined , Null , Boolean , Number , String ,Symbol和一种引用类型Object,下面我们就来一一看穿,哦不,识别他们。
- typeof
前面6种虽多,但是是基本类型,也容易识别,typeof 操作符就能差不多把他们都识别了,
null 不服的站了出来:“能识别我么?”,typeof这下犯难了:"你,你你先坐下。" typeof对Object基本上是脸盲的,除了function之外看谁都是Object, 数组是对象,日期对象是对象,正则是对象,对象也是对象。都特么是对象,typeof 范晕了,只好去请教表哥 instanceof
console.log(typeof "hello");//"string"
console.log(typeof 666);//"number"
console.log(typeof true);//"boolean"
console.log(typeof undefined);//"undefined"
console.log(typeof null);//"object"
var sm = Symbol();
console.log(typeof sm);//"symbol"
console.log(typeof {name: "hello"});//"object"
console.log(typeof function(){});//"function"
console.log(typeof []);//"object"
console.log(typeof new Date);//"object"
console.log(typeof /\d/);//"object"
function Person(){};
console.log(typeof new Person);//"object"
简单说,记住两点就好了1.typeof可识别出null之外的基本类型 2.不能识别除function之外的具体对象类型
2. instanceof
instanceof 给人一种成大事不拘小节的感觉,5个基本类型一个也识别不了。不过对对象的识别还是有一套的,不仅能识别内置对象类型,还能识别自定义对象类型,厉害了我的instanceof ,
console.log("jerry" instanceof String);//false
console.log(12 instanceof Number);//false
console.log(true instanceof Boolean);//false
console.log(undefined instanceof Undefined);//会报错滴
console.log(null instanceof Null); //会报错滴 console.log({name: "hehe"} instanceof Object);//true
console.log(function(){} instanceof Function);//true
console.log([] instanceof Array);//true
console.log(new Date instanceof Date);//true
console.log(/\d/ instanceof RegExp);//true
function Car(){};
var bmw=new Car;
console.log(bmw instanceof Car);//true
console.log(bmw instanceof Object);//true
简单说,记住一句话就好了,判断对象类型找instanceof就好了,不管是自定义的还是内置的统统拿下。
3.constructor
以上两种方法的优缺点很明显,constructor 高调的来了,嘴里还嚷嚷着:“我可是什么都能识别的哦。” 据说他可以通过这些招式判断 类型
比如这样:
(3).constructor === Number // true
true.constructor === Boolean // true
'abc'.constructor === String // true
或者这样:
[].constructor==Array //true
var obj= new Object();
obj.constructor==Object //true
function BadCat(){};
var cat=new BadCat;
cat.constructor === BadCat; //true
一切看起来都很美好,然鹅,,null 和undefined 首先站出来实名反对,constructor 一看傻眼了,这两个是什么东东,在我这里完全识别不了啊,接着cat也发话说上次被constructor 欺骗,还不忘拿出了证据
function BadCat(){};
var cat=new BadCat;
cat.constructor = 123;
cat.constructor === BadCat; //false
这下大家都明白了 原来constructor 不靠谱啊,于是纷纷不再理会他,继续寻找下一个判定类型的英雄。
4.Object.prototype.toString
Object.prototype.toString就在这时低调的出现了,虽然长得有点怪,但是能力没得说。但这玩意怎么用呢?简单来说这样用
Object.prototype.toString.call(obj)
比如:
console.log(Object.prototype.toString.call(233));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]
感觉输出的有点怪怪的,没关系,待会我们用函数把他封装一下就会顺眼多了(斜眼笑),听起来好像很完美,氮素,金无足赤啊盆友们,这家伙不能识别自定义对象啊有木有,如果想识别自定义对象,还是乖乖的找instanceof比较靠谱。
识别标准类型和内置对象类型的函数封装如下:
function type(param){
return Object.prototype.toString.call(param).slice(8,-1).toLowerCase();
}
然后就可以直接拿来用了,美滋滋。
5.最后介绍一项黑科技$.type(),当然这是jQuery封好的方法,引用了jQuery1.4.3及以上的版本可以随意使用。
浅谈js数据类型识别方法的更多相关文章
- 浅谈 js 字符串 trim 方法之正则篇
原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格 等 ...
- 浅谈 js 字符串 search 方法
原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...
- 浅谈 js 对象 toJSON 方法
前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...
- 浅谈JS数据类型存储问题
背景 一个经典的问题,先抛出来给大伙看看: var a = "黑MAO"; var b = a; var c = new Object(); var d = c; a ...
- 浅谈js的join()方法
简单描述:今天看同事的代码,看js的时候,看到了一个join()方法,我从来都没有用过,就查了查,第一次用就记录一下 正经的: 定义和用法 join() 方法用于把数组中的所有元素放入一个字符串. 元 ...
- 浅谈 js字符串 trim 方法之正则篇
关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格 等等.什么 \s 支持 中文空格?是的. 打开 Re ...
- 浅谈js的sort()方法
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码(字符串Unicode码点)的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以 ...
- 浅谈 js 正则之 test 方法
原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...
- 浅谈 js 字符串之神奇的转义
原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...
随机推荐
- python介绍和基础(待补充)
python的介绍 把命令放到一个文件中,文件还能执行,这样的语言叫shell脚本 写一个c语言程序,.c结尾的,gcc运行c语言程序,生成.out文件,然后执行.out文件 c语言是先编写代码,再编 ...
- 服务器抓包命令:tcpdump详解
官网地址:http://www.tcpdump.org/tcpdump_man.html 简介: tcpdump,就是:dump the traffic on a network,根据使用者的定义对网 ...
- 自制mysql的rpm包
MySQL安装一般使用RPM或者源码安装的方式.RPM安装的优点是快速,方便.缺点是不能自定义安装目录.如果需要调整数据文件和日志文件的存放位置,还需要进行一些手动调整.源码安装的优点是可以自定义安装 ...
- 20145331 《Java程序设计》第7周学习总结
20145331 <Java程序设计>第7周学习总结 教材学习内容总结 第十二章 Lambda 1.Lambda定义:一个不用被绑定到一个标识符上,并且可能被调用的函数. 2.在只有Lam ...
- [BZOJ1026]windy数
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...
- Windows下tomcat进程监控批处理程序
在Windows下tomcat进程监控批处理程序脚本如下: @echo off ::tomcat安装目录 set _tomcatDir=E:\myFiles\apache-tomcat-8.5.31 ...
- kafka log文件和offset原理
log与offset 日志存储路径根据配置log.dirs ,日志文件通过 topic-partitionId分目录,再通过log.roll.hours 和log.segment.bytes来分文件, ...
- Hive的三种Join方式
Hive的三种Join方式 hive Hive中就是把Map,Reduce的Join拿过来,通过SQL来表示. 参考链接:https://cwiki.apache.org/confluence/dis ...
- 解题报告: hdu 3949 - 线性基
#include <iostream> #include <cstdio> #define LL long long using namespace std; const in ...
- java高级特性(4)--枚举
枚举(enum),是指一个经过排序的.被打包成一个单一实体的项列表.一个枚举的实例可以使用枚举项列表中任意单一项的值.枚举在各个语言当中都有着广泛的应用,通常用来表示诸如颜色.方式.类别.状态等等数目 ...