js有6种基本数据类型  Undefined , Null , Boolean , Number , String ,Symbol和一种引用类型Object,下面我们就来一一看穿,哦不,识别他们。

  1. 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数据类型识别方法的更多相关文章

  1. 浅谈 js 字符串 trim 方法之正则篇

    原文:浅谈 js 字符串 trim 方法之正则篇 关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等 ...

  2. 浅谈 js 字符串 search 方法

    原文:浅谈 js 字符串 search 方法 这是一个很久以前的事情了,好像是安心兄弟在学习js的时候做的练习.具体记不清了,今天就来简单分析下 search 究竟是什么用的. 从字面意思理解,一个是 ...

  3. 浅谈 js 对象 toJSON 方法

    前些天在<浅谈 JSON.stringify 方法>说了他的正确使用姿势,今天来说下 toJSON 方法吧.其实我觉得这货跟 toString 一个道理,他是给 stringify 方法字 ...

  4. 浅谈JS数据类型存储问题

    背景       一个经典的问题,先抛出来给大伙看看: var a = "黑MAO"; var b = a; var c = new Object(); var d = c; a ...

  5. 浅谈js的join()方法

    简单描述:今天看同事的代码,看js的时候,看到了一个join()方法,我从来都没有用过,就查了查,第一次用就记录一下 正经的: 定义和用法 join() 方法用于把数组中的所有元素放入一个字符串. 元 ...

  6. 浅谈 js字符串 trim 方法之正则篇

    关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等等.什么 \s 支持 中文空格?是的. 打开 Re ...

  7. 浅谈js的sort()方法

    如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码(字符串Unicode码点)的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以 ...

  8. 浅谈 js 正则之 test 方法

    原文:浅谈 js 正则之 test 方法 其实我很少用这个,所以之前一直没注意这个问题,自从落叶那厮写了个变态的测试我才去看了下这东西.先来看个东西吧. var re = /\d/; console. ...

  9. 浅谈 js 字符串之神奇的转义

    原文:浅谈 js 字符串之神奇的转义 字符串在js里是非常常用的,但是你真的了解它么?翻阅<MDN String>就可以了解它的常见用法了,开门见山的就让你了解了字符串是怎么回事. 'st ...

随机推荐

  1. npm使用淘宝镜像

    淘宝 npm 地址: http://npm.taobao.org/ 如何使用 有很多方法来配置npm的registry地址,下面根据不同情境列出几种比较常用的方法.以淘宝npm镜像举例: 1.临时使用 ...

  2. ACM-ICPC 2018 南京赛区网络预赛 G. Lpl and Energy-saving Lamps (弱线段树)

    线段树节点维护区间最小值,查找时优先从左侧的区间寻找. 每一次循环都在树中不停寻找第一个小于等于当前持有数的值,然后抹去,直到找不到为止. #include<cstdio> #includ ...

  3. NC开发笔记指导

    修改端口 InvocationInfoProxy.getInstance().get().getUserCode(); 前台 Nchome F:\JAVA\Projects\ERPEHROA\ufid ...

  4. 使用selenium前学习HTML(3)——元素

    <!-- HTML 元素指的是从开始标签(start tag)到结束标签(end tag)的所有代码. 注释:开始标签常被称为开放标签(opening tag),结束标签常称为闭合标签(clos ...

  5. Chrome搜索设置

    https://encrypted.google.com/ncr https://encrypted.google.com/search?{google:RLZ}{google:acceptedSug ...

  6. [caffe]caffe资料收集

    1.caffe主页,有各种tutorial. 2.Evan Shelhamer的tutorial,包括视频.

  7. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置

    0x00 Redis简介 Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值 ...

  8. CSS 图片廊

    CSS 图片廊 一.示例一 代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  9. [pixhawk笔记]6-uORB流程及关键函数解析

    本文中将结合代码.文档及注释,给出uORB执行流程及关键函数的解析,由于uORB的机制实现较为复杂,所以本文主要学习如何使用uORB的接口来实现通信.回到上一篇笔记中的代码: #include < ...

  10. C#生成PDF2019

    因接口生成Pdf推送, 工作需要进行Pdf生成,但网上生成Pdf的文档好少: 1.生成Pdf需要文件路径/内容  都可以配置 2.使用组件 itextsharp.dll 本人用版本:v2.0.5072 ...