如何判断JavaScript中的数据类型

在JS中,有许多api和方法可以用来判断一个变量的类型,比如typeof,instanceof等,但是有些时候这些方法并不能很准确的判断出一个变量的类型,

比如如果用typeof判断null:

typeof null   //'object'

此时判断出来的类型为obj,这是由于在计算机底层中,任何数据类型都是以二进制形式存在的,而obj的前三位二进制码为000,null的二进制码刚好全为0,所以会造成这种误判。那我们如何准确的判断一个变量的数据类型呢?

方法一:typeof

typeof 可以用来区分除了 null 类型以外的原始数据类型,对象类型的可以从普通对象里面
识别出函数:
typeof undefined  // "undefined"
typeof null       // "object"
typeof 1          // "number"
typeof "1"        // "string"
typeof Symbol()   // "symbol"
typeof function() {}   // "function"
typeof {}         // "object"

那我们如何判断一个变量是否为null呢?

1)通过 ===(全等符号)

let a = null
a === null    // true

2)通过Object.prototype.toString.call()    下文会着重介绍。

let a = null
Object.prototype.toString.call(a)   // null

当我们用typeof判断一个未声明的变量时,并不会报错,而是会返回undefined

typeof a  // undefined

方法二: instanceof

instanceof 不能用于判断原始数据类型的数据,他只能用来判断变量是否为另一个变量的实例对象,也就是说只能判断引用数据类型。
3 instanceof Number     // false
'3' instanceof String   // false
true instanceof Boolean // false


var date = new Date()
date instanceof Date      // true
var number = new Number()
number instanceof Number  // true
var string = new String()
string instanceof String  // true

 需要注意的是,instanceof判断出来的值也不一定是准确的,因为在ES7中规定了可以通过Symbol.hasInstance 方法来覆盖。

方法三:Object.prototype.toString.call()

Object.prototype.toString.call()  可以用来判断绝大多数的情况,它可以准确判断出变量的类型,包括null和引用数据类型(object,array等),但是无法判断出 数字和数字对象类型

Object.prototype.toString.call(undefined)     // [object Undefined]
Object.prototype.toString.call(null)          // [object Null]
Object.prototype.toString.call(3)             // [object Number]
Object.prototype.toString.call(new Number(3)) // [object Number]
Object.prototype.toString.call(true)          // [object Boolean]
Object.prototype.toString.call('3')           // [object String]
Object.prototype.toString.call(Symbol())      // [object Symbol]

例如代码中的 

Object.prototype.toString.call(3)             // [object Number]
Object.prototype.toString.call(new Number(3)) // [object Number]

按理来说,下面的这条代码输出的结果应该为一个object,用typeof判断也为object

所以,此方法并不是绝对正确的判定方法,但是大多数情况下,用它来判断是最准确的。

在ES7中,也规定了Symbol.toStringTag()方法,自定义Object.prototype.toString.call() 的行为。所以使用这个方法来判断数据类型也不一定是可靠的 。

方法四:Array

Array.isArray() 方法可以用来准确判断对象是否为一个数组,返回值为布尔类型。
Array.isArray([]) // true
Array.isArray({}) // false

以上就是JS判断数据类型的几种常用方法了。 在实际应用中,应该结合具体情况分析需要的到底是那种方法,以免出现误判和bug噢 ~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值