js 如何判断数据类型

本文除了介绍如何检测数据类型,顺带也将数据类型也大概介绍了下
参考《JavaSript高级程序设计》、MDN网站等

方法总结为下面几类

  1. typeof
  2. instanceof
  3. jquery
  4. Object.toString.call(obj)
  5. constructor
1. typeof
语法

typeof operand 或者 typeof (operand)

类型说明
数据类型 typeof 输出结果 说明
undefined "undefined" 未初始化和未声明的变量
null "object" 只有null这个值才是这种类型;
\color{red}{注}:undefined值派生自null, undefined == null返回true,undefined === null返回false, 但不能通用这两个变量,null为了变现变量是空对象,undefined为了体现变量为初始化或者未声明
boolean "boolean" 只有true、false;
\color{red}{注}:区分大小写,True, False这些都不是
Boolean()函数可以将其他变量转换成为boolean变量, 关于转换方式,可见附录 1. Boolean([value])函数 转换
Number "number" a.  如果浮点数值小数点后没有跟任何数字的话,会被转换成整型来保存;

b.   浮点数值最高精度是17位,在js中0.1+0.2=0.30000000000000004,所以在比较的时候需要注意,使用if(0.1+0.2 == 0.3){}else{}会进入到else分支;但有些计算又是正确的,例如0.15+0.05==0.2返回true,最好还是不要使用浮点数去进行比较计算

c.   内存限制,超过浏览器的计算范围,都会被转换为 Infinity-Infinity(正负无穷),并且不能再进行计算(Infinity - Infinity返回结果是NaN);可以通过isFinte(value)函数判断;Number.NEGATIVE_INFINITY、Number.POSITIVE_INFINITY分别代表负、正Infinity的值;

d.   NaN(Not a number)
     关于NaN的操作(例如NaN/10返回NaN);
     NaN与任何值都不相等,NaN == NaN也返回false
     isNaN()用于检测该类型,如果该值可以转换为数值的话(包括Infinity-Infinity),则返回false,例如"10"Boolean值,其余不能被转换成为数值的返回true;isNaN还可以检测对象,首先调用valueOf()方法,如果没有的话,再调用toString()方法

e.   数值转换方法(具体转换方法见附录 2. Number数值转换方法):
     Number()
     parseInt()
     parseFloat()
String "string" '\u03a3'类似的字符长度只算1;
数值、布尔值、对象、字符串都自带.toString()方法,nullundefined没有;
num.toString(8)可以将数值转换成8进制的字符显示,其他进制类同;
String([value])可以将所有类型转换成字符;
任意值+""可以转换成为字符
Symbol "symbol" 关于Symbol-阮一峰
宿主对象(由JS环境提供) Implementation-dependent
函数对象 "function"
Object "object" 任何其他对象
2. instanceof

用于识别对象的问题

语法

object instanceof constructor
object: 要检测的对象
constructor: 某个构造函数

说明

instanceof运算符用来检测constructor.prototype是否存在于参数object的原型链上
当typeof无法分辨是null还是object时,就可以用这个方法
可以参考这篇文章JavaScript instanceof 运算符深入剖析

以下是上述作者整理的instanceof运算符代码

function instance_of(L, R) {
  var O = R.prototype;    // 取R的显示原型
  L = L.__proto__;      // 取L的隐式原型
  while(true) {
    if(L === null) 
      return false;
    if(O === L) 
       return true;
    L = L.__proto__;
  }
}
举例说明
var a = new String("123");
console.log(a instanceof String);         // true
3. jQuery中判断的方法(基于jQuery3 .3.1)
判断数组

jQuery.isArray(object)
实际调用Array.isArray(object)方法判断

jQuery.isArray([1, 2, 3])     // true
jQuery.isArray('[1, 2, 3]')    // false,字符串
判断函数

jQuery.isFunction(value)
实际调用typeof value === "function"

判断数字

jQuery.isNumeric(value)
jQuery把数字和可以转换成数字的字符串都判断为数字

// jQuery源码
jQuery.isNumeric = function(obj) {
  var type = jQuery.type(obj);    // 判断数据类型
  return (type === "number" || type === "string") &&
    !isNaN(obj - parseFloat(obj));     // 排除Infinity和-Infinity,因为isNaN(Infinity)返回的是true
}
判断空对象

jQuery.isEmptyObject(obj)
通过for in循环变量value判断是否是空对象

for(name in obj) {
  return false;   // 不是空对象
}
return true;
判断是否是纯粹的对象

jQuery.isPlainObject(value)
其中只介绍源码中其判断是否为对象方法

 isPlainObject: function(obj) {
  ...
  if(!obj || toString.call(obj) !== "[object object]") {    // 用toString方法判断其是否是object类型
    return false;
  }
  ...
} 
判断类型

jQuery.type(obj)

toType(obj) {
  if ( obj == null ) {
    return obj + "";      // null 就返回null
  }

  return typeof obj === "object" || typeof obj === "function" ?
    class2type[ toString.call( obj ) ] || "object" :    // 通过{}.toString.call来判断类型
    typeof obj;
 }

// class2type[ toString.call( obj ) 
class2type["object xx"] = xx.toLowerCase()     // xx为对应类型(Boolean Number String Function Array Date RegExp Object Error Symbol)

其他
  1. {}.toString.call 返回[object xx](xx是对应的数据类型,包括boolean Number String Function Array Date RegExp Object Error Symbol
  2. constructor根据对象的constructor判断
var a = [1, 2, 3];
a.constructor === Array    // true
附录
1. Boolean([value])函数 转换

参考链接: MDN—Boolean() 网站

  • 返回false的情况
    省略该参数、0、-0、nullfalseNaNundefined、空字符串,生成的Boolean对象的值是false,DOM对象document.all对象传入也是false
  • 返回true的情况
    除上以外均为true,包括Boolean("false")(因为不是空字符串),Boolean({})Boolean([])(因为任何对象都会被转换成true,除非对象被置为null了)。

    \color{red}{注!!!}
  • 推荐使用Boolean([value])而不是New Boolean([value]),原因如下
    typeof(new Boolean([value]))返回的是"object"
    typeof(Boolean([value])) 才是返回"boolean"
    New Boolean()除了nullfalse,在使用if(new Boolean([value]))直接进行判断的时候都会被当成true来对待,Boolean()就不会有这个问题。
  • 那么如何正确使用new Boolean()
    通过valueOf()来获取对应的boolean值
      var a = New Boolean(''); 
      if(a.valueOf()) { 
         \\ ...
      } else {
         \\ ...
     }
    
2. Number数值转换方法
  • Number()
    a.   Boolean值对应转换成为0,1;
    b.   数字传入什么就返回什么(注:Number(0123)是个8进制数字)
    c.   null返回0
    d.   undefined返回NaN
    e.   字符串的话分情况:
          e1. 如果是都是数字形式的字符串,则返回对应的数字;例如Number("0123")返回123,会忽略前面的0。
          e2. 如果是0x15这种带有效的16进制格式的,则返回对应的十进制数。
          e3. 空字符串返回0
          e4. 其余返回NaN
    f.   对象的话,先调用valueOf()如果返回NaN,再调用toString()方法
  • parseInt()
    a.   转换字符串时,按遇到的第一个非空字符进行判断。
          a1. 第一个字符是数字字符的话,解析到最后一个非数字字符
          a2. 如果遇到的不是数字或者负号,返回 NaN,反之则按照a1的数字转换方式进行转换,例如parseInt(" 123adfa123"),返回123
          a3. 空字符返回NaN
          a4. 如果0x开头,则会当成16进制来解析,0开头则当成8进制来解析(ES5 parseInt(070)还是会被当成10进制,返回70
    b.    parseInt(num, 进制),例如parseInt(0x15, 16)或者parseInt("AF", 16)都会被当成16进制进行解析;parseInt(aaa, 8)由于aaa不能被转换成为8进制,所以返回NaN
  • parseFloat()
  1.    数字型字符串的话,只能解析到第一个小数点,第二个小数点的话,作废处理,例如parseFloat("11.11.23")返回11.11
  2.    只会解析10进制,带16进制"0x"标志的字符都会被转换成为0,parseFloat("0x13")返回0,parseFloat("0x")也返回0;
  3.    其余与parseInt()一样


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,258评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,335评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,225评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,126评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,140评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,098评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,018评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,857评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,298评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,518评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,400评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,993评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,638评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,661评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,145评论 0 13
  • 1.通过typeof可以判断处几种基本数据类型Boolean,number,string,null,undefin...
    舟渔行舟阅读 642评论 0 1
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,122评论 0 21
  • 今天比较忙,把昨天说C6喷漆后杠 倒车雷达不好用 等晚上忙完了看到车才想起来!晚上又加班查原因 结果才发现跟喷漆没...
    京心达白金阅读 88评论 0 0
  • 相机里的画面只是记录,心里的定格才是怀念。----送给那些在路上的人 谁能告诉我春天来过得痕迹?是冬天...
    雲中客阅读 287评论 0 1