JavaScript 的数据类型分为两类:原始类型(基本类型)和对象类型(引用类型)。原始类型包括数字、字符串和布尔值,另外有两个特殊的原始值:null 和 undefined,除此之外的都是对象。对象还包括两种特殊的对象:数组和函数。

下面所有代码表达式如果返回值为 true 表示判断成立,否则不成立,变量 obj 表示需要判断的值。

通用方法

使用 typeof 运算符

判断数据类型可以使用 typeof 运算符,返回值是一个代表数据类型的字符串(注意是字符串,而且是小写的):

typeof 1             // 'number'
typeof 'abc' // 'string'
typeof false // 'boolean'
typeof undefined // 'undefined'
typeof null // 'object'
typeof {x: 1} // 'object'
typeof [1, 2, 3] // 'object'
typeof function() {} // 'function'

typeof 运算符可以有效判断数字、字符串、布尔值和 undefined 等原始类型,不过在面对数组和对象时就无能为力了。

借用 Object.prototype.toString() 方法

借用 Object.prototype.toString() 方法可以得到一个表示对象的类型的字符串:

var toString = Object.prototype.toString;
toString.call('abc') // '[object String]'
toString.call(true) // '[object Boolean]'
toString.call([]) // '[object Array]'
toString.call({}) // '[object Object]'
toString.call(/./) // '[object RegExp]'
toString.call(new Date) // '[object Date]'
toString.call(Math) // '[object Math]'

使用该方法可以有效判断数组、函数、日期、正则表达式等对象类型(引用类型)。在 ECMAScript 5 中还可以用这个方法来判断 null

undefined

toString.call(null)      // '[object Null]'
toString.call(undefined) // '[object Undefined]'

下面是一些特殊情况。

原始类型(基本类型)

数字

使用 typeof 运算符可以判断任意数字、NaN 或者 Infinity

typeof NaN      // 'number'
typeof Infinity // 'number'

如果要排除 NaNInfinity 可以使用 isFinite() 方法,不过 isFinite() 方法试图将一些非数字类型转换为数字,因此需要双重保险:

typeof obj === 'number' && isFinite(obj)

上面的表达式如果返回为 true 则保证了变量 obj 是数字类型的同时不是 NaN 或者 Infinity,毕竟我们不希望这两个特殊数值参与数学运算。ECMAScript 6 增加的 Number.isFinite() 方法有同样效果。

整数

判断一个数是整数并且在安全范围内,利用整数取整后还是与自身相等的特点:

typeof obj === 'number' && isFinite(obj)
&& obj > -9007199254740992
&& obj < 9007199254740992
&& Math.floor(obj) === obj

NaN

全局的 isNaN() 方法也试图将一些非数字类型隐式转换为数字,如果转换成功,它会认为这个值是一个数字,否则会认为这是一个 NaN

isNaN(NaN)       // true
isNaN(0/0) // true 0 除以 0 的结果为 NaN
isNaN('1') // false 字符串 '1' 可以隐式转换为数字 1
isNaN(true) // false 布尔值 true 可以隐式转换为数字 1
isNaN([]) // false 空数组可以隐式转换为数字 0
isNaN(Infinity) // false
isNaN('abc') // true
isNaN(undefined) // true

字符串 'abc'undefined 都不能隐式转换为一个数字,所以被判断为是一个 NaN

NaN 是一个特殊数值,它不等于任何值,甚至不等于它自己,因此判断一个值为 NaN 的最好方式是判断它是一个数字类型同时不等于自身:

typeof obj === 'number' && obj != +obj

ECMAScript 6 增加的 Number.isNaN() 方法更好地解决了这个问题,只有值为 NaN 的时候才会返回 true

Number.isNaN(NaN)        // true
Number.isNaN(Number.NaN) // true
Number.isNaN(0/0) // true
Number.isNaN(Infinity) // false
Number.isNaN('abc') // false
Number.isNaN(undefined) // false

可以看出 Number.isNaN() 方法和 isNaN() 方法是不一样的。Number.isNaN() 方法仅用于判断是否是特殊值 NaN

布尔值

布尔值不是 true 就是 false,可以使用 typeof 运算符,也可以像下面这样判断:

obj === true || obj === false

Undefined

在 ECMAScript 3 中 undefined 是可读写的,所以直接与 undefined 作比较返回的结果不一定是准确的,像这样 var undefined = 1 在有些实现中是可以改变其值的,此时再与之做比较得到的结果就有点出人意料了,通常情况下还是使用 typeof 运算符来判断:

typeof obj === 'undefined'

不过使用 typeof 运算符有一个不好的地方是不能区分未定义的变量和值为 undefined 的变量(两者还是有区别的),另外一种方式是使用 void 运算符,因为它的运算结果总是返回 undefined

obj === void 0

Null

使用 typeof 运算符判断 null 将会返回 'object',这明显不是想要的,所以最好的方式是直接与 null 值进行比较:

obj === null

这里必须使用 ===,因为 undefined == null 也会返回 true

存在判断

对值为 nullundefined 的变量读取属性时会引发错误,因此有时候需要做存在判断,简单地使用 if 语句来判断,会将那些可以隐式转换为 false 的值也一概排除掉了,比如数字0、空字符串、空数组(这里有个错误,空数组单独放在 if 语句里面将会转换为 true,而作比较的时候是与 false 相等的,比如 [] == false)之类的,它们都可以隐式转换为 false,因为 undefined == null 会返回 true,而和其它任何非 null 或者 undefined 的值比较都会返回 false,所以更好的办法是直接与 null 值做比较:

if (obj != null) {
obj.property;
}

这样就可以判断变量 obj 既不是 undefined 也不是 null,或者像下面这样判断:

typeof obj !== 'undefined' && obj !== null

通过存在判断才可以放心使用 . 语法获取属性。

对象类型(引用类型)

对象

要区别 null 和其它对象可以像下面这样判断,因为 null 值可以隐式转换为 false

obj && typeof obj === 'object'

这样判断就可以把 null 给排除掉,变量 obj 是对象或者数组或者其它对象(不包括函数)。下面是另外一种方法:

obj === Object(obj)

使用 Object() 方法如果传入的参数不是对象将会被转换为对象,否则,只是简单地将传入的参数返回。该方法可以判断所有对象,包括函数。

数组

判断数组的方法:

Object.prototype.toString.call(obj) === '[object Array]'

ECMAScript 5 增加了数组检测的原生方法:

Array.isArray(obj)

函数

虽然 typeof 运算符将函数特别对待了,但是使用 typeof 运算符在有些实现中不是函数的也会返回 'function',因此还是使用如下方法来判断函数:

Object.prototype.toString.call(obj) === '[object Function]'

正则表达式

使用 typeof 运算符判断正则表达式,一般都会返回 'object',不过也有一些实现会返回 'function',所以,还是借用 Object.prototype.toString 方法来判断:

Object.prototype.toString.call(obj) === '[object RegExp]'

参考资料

JavaScript 数据类型判断的更多相关文章

  1. javascript数据类型判断

    javascript基本数据类型:原始类型  和  引用类型 原始类型(简单数据类型):String,Number,Boolean,Undefined,Null,Symbol(ES6新增) 引用类型( ...

  2. 关于 JavaScript 数据类型判断

    在 JavaScript 中,有 undefined.null.number.string.boolean 五种基本数据类型,另外,有一种复杂数据类型 object ,类似于 C# 中值类型.引用类型 ...

  3. JavaScript学习总结(2)——JavaScript数据类型判断

    最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断,在此做一个总结吧! 一.JS中的数据类型  1.数值型(Number):包括整数. ...

  4. JavaScript数据类型判断的四种方法

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14416375.html 本文分享了JavaScript类型判断的四种方法:typeo ...

  5. javascript 数据类型判断总结

    一 typeof 回顾:js有五种基本数据类型:值类型("number","string","boolean","undefine ...

  6. javaScript数据类型及判断

    ECMAScript数据类型概念: ECMAScript数据类型分为两类:原始类型和对象类型(即基本类型和引用类型): ECMAScript数据类型也可以分为可变类型和不可变类型,数组和对象属于可变类 ...

  7. Javascript 中的数据类型判断

    (迁移自旧博客2017 09 25) typeof 我们常使用typeof来判断数据类型,在常规场景中足以应付数据类型判断的需要: var obj = { name: 'zhangxiang' }; ...

  8. javascript数据类型的判断

    最近看到了很多关于数据类型判断的方法,总结了下 一.javascript的数据类型 js数据分为两种类型:原始数据类型和引用数据类型.原始数据类型有:string.number.boolean.und ...

  9. 请你讲一讲JavaScript有哪些数据类型, 数据类型判断有哪些方法?

    js的8种数据类型 JavaScript中有8种数据类型, 包括基本数据类型(number, string, boolean, null, undefined, symbol, bigint)和引用数 ...

随机推荐

  1. Office英语学习好帮手

    Office提供了强大实用的英语学习助手,它可以自动翻译中英文,还可以显示详尽的解释帮助信息,当然标准的发音也是必不可少的.如何启动屏幕取词翻译功能呢?如何让office自动取词并翻译呢?如何收听单词 ...

  2. How Spring Boot Autoconfiguration Magic Works--转

    原文地址:https://dzone.com/articles/how-springboot-autoconfiguration-magic-works In my previous post &qu ...

  3. Spark入门实战系列--7.Spark Streaming(下)--实时流计算Spark Streaming实战

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .实例演示 1.1 流数据模拟器 1.1.1 流数据说明 在实例演示中模拟实际情况,需要源源 ...

  4. Anliven - 如何逼疯你的小伙伴

    如果你也曾为某人某事"发疯发狂,懵逼连连". . 无礼:随意牵扯他人,不了解实际情况,却对他人工作横加点评甚至是指责. 无知:自我感觉良好,自己总是最正确最合理的,除了自己,没人会 ...

  5. Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

    前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一 ...

  6. 第20/24周 死锁(Deadlocking)

    大家好,欢迎回到性能调优培训.今天讨论SQL Server里的死锁(Deadlocking),第5个月的培训就结束了.当2个查询彼此等待,没有查询可以继续它的工作就会发生死锁.第一步我会概括介绍下SQ ...

  7. 关于MYSQL数据库安装方式及相关设置简要说明

    网上关于MYSQL的教程非常多,但都不是最新的,我这里只是针对最新版本的MY SQL 的安装与设置进行一个简要的说明,大部份操作都相同. 以下是按照WINDOWS 64位操作系统+MY SQL 5.6 ...

  8. c#中 HttpWebRequest请求抛异常,基础连接已经关闭: 连接被意外关闭

    在用httpWebRequest模拟请求的时候有时因为服务器等方面做了请求的限制, 在请求会出现基础连接已经关闭: 接收时发生意外错误的错误 一般原因是因为服务器不允许与 Internet 资源建立持 ...

  9. 【转】 依赖注入框架Autofac的简单使用

    Autofac是一款IOC框架,比较于其他的IOC框架,如Spring.NET,Unity,Castle等等所包含的,它很轻量级性能上也是很高的.于是,今天抽空研究了下它.下载地址:http://co ...

  10. Windows 8 应用商店无法连接到网络的终极完美解决方案

    当你看到以下几个步骤的时候,你可能会不以为然,因为你已经试过了,还是没成功,依然提示"你的电脑没有连接到Internet或者现在无法使用Windows应用商店,要使用Windows应用商店, ...