js 数据类型判断

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容