1、 typeof
typeof
操作符返回一个字符串,表示未经计算的操作数的类型。
语法:typeof operand
看下面例子:
> typeof 1
output: "number"
> typeof '1'
output: "string"
> typeof true
output: "boolean"
> typeof null
output: "object"
> typeof undefined
output: "undefined"
> typeof []
output: "object"
> typeof function () {}
output: "function" // 一些浏览器会是 object
> typeof {}
output: "object"
> typeof Symbol()
output: "symbol"
由上可看,typeof很好用,但有缺陷,像null
、数组
都被判定为object
。
null
会被判断为object
跟JavaScript开始的设计有关具体解释看这
那么,为什么数组
被判定为object
呢?其实与数据背景有关:
JavaScript中有两种数据类型:
1、原始数据类型:包括null,undefind,String,Boolean,Number和Object。
2、派生数据类型/特殊对象:包括Function,Array和RegExp。这些都是JavaScript中的“Object”派生而来的。
2、instanceof
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链
上。即instanceof
是用于判断引用类型
属于哪个构造函数
的
语法:object instanceof constructor
留意语法中的 constructor
看下面例子:
> [] instanceof Array
output: true
> [] instanceof Object
output: true
> ({}) instanceof Object //一定要加原括号,不然 {} 被认为是语句会报错
output: true
> (function () {} ) instanceof Function
output: true
> (function () {} ) instanceof Object
output: true
> /\d/ instanceof RegExp
output: true
> /\d/ instanceof Object
output: true
// 特殊的
> class a {}
> class b extends a {
}
> const oB = new b()
> a instanceof Function
output: true
> b instanceof Function
output: true
> oB instanceof b
output: true
> oB instanceof a
output: true
> oB instanceof Object
output: true
3、封装一个函数判断数据类型
每个对象都有一个
toString
方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。如果此方法在自定义对象中未被覆盖,toString()
返回 "[object type]
",其中 type 是对象的类型
封装(返回结果根据自己决定是否返回小写,跟.toLowerCase()
来实现),以下结果首字母大写:
const _toString = Object.prototype.toString
function type (param) {
const str = _toString.call(param)
return str.slice(8, str.length -1)
}
应用:
> type(1)
output: "Number"
> type('1')
output: "String"
> type(null)
output: "Null"
> type(undefined)
output: "Undefined"
> type(true)
output: "Boolean"
> type(NaN)
output: "Number"
> type([])
output: "Array"
> type(Symbol())
output: "Symbol"
> type(function () {})
output: "Function"
> type(class a {})
output: "Function"
> type (new Set())
output: "Set"
> type (new Map())
output: "Map"
4、其他
- 判断数组
Array.isArray(obj) 方法
参数:obj
为需要检测的值。
返回值:如果值是Array
,则为true
; 否则为false