本文将讲解我目前所知道的判断JavaScript
数据类型的方法。JavaScript
数据类型一共有7
种:segmentfault
除了Object
以外的6
种属于原始数据类型。有时,咱们还会细分Object
的类型,好比Array
,Function
,Date
,RegExp
等。数组
typeof
能够用来区分除了Null
类型之外的原始数据类型,对象类型的能够从普通对象里面识别出函数:dom
typeof undefined // "undefined" typeof null // "object" typeof 1 // "number" typeof "1" // "string" typeof Symbol() // "symbol" typeof function() {} // "function" typeof {} // "object"
问题一:typeof
不能识别null
,如何识别null
?
答案:若是想要判断是否为null
,能够直接使用===
全等运算符来判断(或者使用下面的Object.prototype.toString
方法):函数
let a = null a === null // true
问题二:typeof
做用于未定义的变量,会报错吗?
答案:不会报错,返回"undefined"
。prototype
typeof randomVariable // "undefined"
问题三:typeof Number(1)
的返回值是什么?
答案:"number"
。注意Number
和String
做为普通函数调用的时候,是把参数转化为相应的原始数据类型,也就是相似于作一个强制类型转换的操做,而不是默认当作构造函数调用。注意和Array
区分,Array(...)
等价于new Array(...)
。code
typeof Number(1) // "number" typeof String("1") // "string" Array(1, 2, 3) // 等价于 new Array(1, 2, 3)
问题四:typeof new Number(1)
的返回值是什么?
答案:"object"
。对象
typeof new Number(1) // "object" typeof new String(1) // "object"
instanceof
不能用于判断原始数据类型的数据:ip
3 instanceof Number // false '3' instanceof String // false true instanceof Boolean // false
instanceof
能够用来判断对象的类型:字符串
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
的结果并不必定是可靠的,由于在ECMAScript7
规范中能够经过自定义Symbol.hasInstance
方法来覆盖默认行为。详情参见ECMAScript7规范中的instanceof操做符。get
Object.prototype.toString.call(undefined).slice(8, -1) // "Undefined" Object.prototype.toString.call(null).slice(8, -1) // "Null" Object.prototype.toString.call(3).slice(8, -1) // "Number" Object.prototype.toString.call(new Number(3)).slice(8, -1) // "Number" Object.prototype.toString.call(true).slice(8, -1) // "Boolean" Object.prototype.toString.call('3').slice(8, -1) // "String" Object.prototype.toString.call(Symbol()).slice(8, -1) // "Symbol"
由上面的示例可知,该方法没有办法区分数字类型和数字对象类型,同理还有字符串类型和字符串对象类型、布尔类型和布尔对象类型。
另外,ECMAScript7
规范定义了符号Symbol.toStringTag
,你能够经过这个符号自定义Object.prototype.toString
方法的行为:
'use strict' var number = new Number(3) number[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(number).slice(8, -1) // "Custom" function a () {} a[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(a).slice(8, -1) // "Custom" var array = [] array[Symbol.toStringTag] = 'Custom' Object.prototype.toString.call(array).slice(8, -1) // "Custom"
由于Object.prototype.toString
方法能够经过Symbol.toStringTag
属性来覆盖默认行为,因此使用这个方法来判断数据类型也不必定是可靠的。
Array.isArray(value)
能够用来判断value
是不是数组:
Array.isArray([]) // true Array.isArray({}) // false (function () {console.log(Array.isArray(arguments))}()) // false
本文讲解了我目前所知道的判断JavaScript
数据类型的方法,但愿你们能有所收获。若是本文有什么错误或者不严谨的地方,欢迎在评论区留言。