JS判断数据类型和常用的标准内置对象

2020-10-29T14:05:00

JS判断数据类型和常用的标准内置对象

在了解如何判断JS的数据类型前我们必须要知道目前JS到底有几种数据类型。

JS的数据类型(8种)

  • 7种原始类型

    • Boolean

    ​ 布尔类型,只有两个值true和false

    • Null

    ​ Null类型,表示尚未创建的对象,空引用

    • Undefined

    ​ 未定义变量的初始值

    ​ 数字类型,它基于 IEEE 754 标准的双精度 64 位二进制格式

    • BigInt(ES10新增,V8引擎v6.7 默认启用对 BigInt 的支持)

    ​ 可以表示大于 253 - 1 的整数,即任意大的整数

    • String

    ​ 字符串类型,用于表示文本类型

    ​ 在ES5中,对象属性名都是字符串容易造成属性名冲突。为了避免这种情况的发生,ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。

  • Object

​ 对象,一组属性的集合。

JS数据类型的判断方法

  1. 使用typeof来判断:

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

typeof true //boolean
typeof null //object
typeof undefined //undefined
typeof 1 //number
typeof 1n //bigint
typeof '1' //string
typeof Symbol() //symbol
typeof Object() //object

由上面的结果可见,typeof不能判断Null类型和Object类型。因为Null类型本身也就是表示空对象,因此不能判断到底是Null类型还是Object类型倒也无伤大雅。完整的判断JS数据类型代码如下:

function type(o) {
    let s = typeof o;
    if(s === 'object') {
        return o == null ? 'null' : 'object'; 
    }else {
        return s;
    }
}

JS标准内置对象及判断方法

标准的内置对象例如 Array, Boolean, Date, Error, Function, JSON, Math, Number, Object, RegExp, String, Map, Set, WeakMap , WeakSet 以及其他对象。那么标准的内置对象和Object是什么关系呢?请看下方的验证

Set.prototype.__proto__ === Object.prototype // ture

这就整明白了,原来他们是在原型链上的,Set继承了Object,由此可以推断出,内置标准对象都是继承自Object(这里不做一一验证)。既然都在原型链上,那么判断一下子就简单了,这里需要用到instanceof

1.instanceof判断内置对象

instanceofinstanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上)。

if(typeof o === 'object' && o instanceof Array) {
    //o是数组
}else if(o instanceof Date) {
   //...
} // ...

通过这样的方法我们就能轻松判断了。

2.使用Object.prototype.toString方法来判断

除了instanceof,作为另一种方法我们也可以用Object.prototype.toString。其中 toString() 来获取每个对象的类型。为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg。注:Object.toString不一定调用的原型上的,可以被对象自定义方法所覆盖

不同数据类型的Object.prototype.toString方法返回值如下。

  • 数值:返回[object Number]
  • 字符串:返回[object String]
  • 布尔值:返回[object Boolean]
  • undefined:返回[object Undefined]
  • null:返回[object Null]
  • 数组:返回[object Array]
  • arguments 对象:返回[object Arguments]
  • 函数:返回[object Function]
  • Error 对象:返回[object Error]
  • Date 对象:返回[object Date]
  • RegExp 对象:返回[object RegExp]
  • ...
Object.prototype.toString.call(2) // "[object Number]"
Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call(true) // "[object Boolean]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(Math) // "[object Math]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call([]) // "[object Array]"

利用这个特性我们可以写一个方法来专门判断JS的标准内置对象:

var type = function (o){
  var s = Object.prototype.toString.call(o);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};

type({}); // "object"
type([]); // "array"
type(1); // "number"
type(null); // "null"
type(); // "undefined"
type(/abc/); // "regex"
type(new Date()); // "date"
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »