在JS中,有许多api和方法可以用来判断一个变量的类型,比如typeof,instanceof等,但是有些时候这些方法并不能很准确的判断出一个变量的类型,
比如如果用typeof判断null:
typeof null //'object'
此时判断出来的类型为obj,这是由于在计算机底层中,任何数据类型都是以二进制形式存在的,而obj的前三位二进制码为000,null的二进制码刚好全为0,所以会造成这种误判。那我们如何准确的判断一个变量的数据类型呢?
方法一:typeof
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
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([]) // true Array.isArray({}) // false
以上就是JS判断数据类型的几种常用方法了。 在实际应用中,应该结合具体情况分析需要的到底是那种方法,以免出现误判和bug噢 ~~~~