浅谈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 ...
随机推荐
- Django:学习笔记(5)——会话
Django:学习笔记(5)——会话 配置中间件 Django中使用会话,需要配置一个中间件. 配置会话引擎 默认情况下,Django在数据库中存储sessions(使用了django.contrib ...
- nginx配置访问图片路径(windows)
简介 Nginx(("engine x")由俄罗斯的程序设计师Igor Sysoev所开发)是一款自由的.开源的.高性能的HTTP服务器和反向代理服务器:同时也是一个IMAP.PO ...
- 百度nlp实习生转岗(猝)
一面: 大部分是问项目相关的.只记住了几个关键的问题. 1.手写快排 2.生成模型与判别模型的区别 分类问题:2种形式: F(x)=y p(y|x) 生成模型:由数据学习联合分布概率p(x,y),然后 ...
- 【npm】使用淘宝提供的镜像来加速npm
国外的npm用着非常不稳定,时常一直就卡在安装的进度条上 淘宝提供了一个国内镜像,保障了安装网络环境的稳定,和源地址10分钟同步一次,没有被收录的包会自动切换到npm官方下载,并添加进镜像库. 地址: ...
- python3_ftp多线程上传图片
项目中研发人员自己写了ftp服务,没有标准ftp中的列表,准备用jmeter对ftp压力测试时发现jmeter要验证列表(如果有同学用jmeter测试过类似的分享一下方法谢谢了),没办法只能用pyth ...
- MLlib1.6指南笔记
MLlib1.6指南笔记 http://spark.apache.org/docs/latest/mllib-guide.html spark.mllib RDD之上的原始API spark.ml M ...
- Android利用方向传感器获得手机的相对角度实例说明
http://www.jb51.net/article/37710.htm 1.android 的坐标系是如何定义x, y z 轴的 x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较 ...
- JS的checkbox状态切换dom无变化
今天调试checkbox,手动加上checked="checked"和去掉,都对实际页面没有产生影响 搜索一番 1.对radio .checkbox 来说说,checked属性可以 ...
- LeetCode (65):Same tree
Total Accepted: 83663 Total Submissions: 200541 Difficulty: Easy Given two binary trees, write a fun ...
- linux 搭建Java环境
一.下载jdk/jre文件 下载链接 二.安装Java环境 1.解压文件到 /usr/java 目录 # tar zxvf jre-8u60-linux-x64.gz 2.配置环境变量 ...