关于javascript:用ObjectprototypetoString做数据类型判断

4次阅读

共计 2575 个字符,预计需要花费 7 分钟才能阅读完成。

这几天在看 js 文档,有个数据类型判断的办法能够记录一下,不便当前翻阅应用,残缺计划放在了文末。


数据类型

js 中有 6 中数据类型,es6 新增了一种。
原始数据类型:Number、String、Boolean、null、undefined;
援用数据类型:Object;
es6 新增类型:Symbol。

Object 里又能够细分 function、object、array、regexp、date 等。


用 toString()判断数据类型

Object.prototype.toString办法返回对象的类型字符串,因而能够用来判断一个值的类型:

var obj = {};
obj.toString() // "[object Object]"

下面代码调用空对象的 toString 办法,后果返回一个字符串 object Object,其中第二个 Object 示意该值的构造函数。这是一个非常有用的判断数据类型的办法。

因为实例对象可能会自定义 toString 办法,笼罩掉 Object.prototype.toString 办法,所以为了失去类型字符串,最好间接应用 Object.prototype.toString 办法。通过函数的 call 办法,能够在任意值上调用这个办法,帮忙咱们判断这个值的类型。

Object.prototype.toString.call(value)

下面代码示意对 value 这个值调用 Object.prototype.toString 办法。

不同数据类型的 Object.prototype.toString 办法返回值如下。
数值:返回 [object Number]。
字符串:返回 [object String]。
布尔值:返回 [object Boolean]。
undefined:返回[object Undefined]。
null:返回[object Null]。
symbol:返回[object Symbol]。
数组:返回 [object Array]。
函数:返回 [object Function]。
Date 对象:返回[object Date]。
RegExp 对象:返回[object RegExp]。
arguments 对象:返回[object Arguments]。
Error 对象:返回[object Error]。
Math 对象:返回[object Math]。
其余对象:返回[object Object]。

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(Symbol()) //"[object Symbol]"Object.prototype.toString.call([]) //"[object Array]"Object.prototype.toString.call(function(){}) //"[object Function]"Object.prototype.toString.call(new Date()) //"[object Date]"Object.prototype.toString.call(/abc/) //"[object RegExp]"(function(){return (Object.prototype.toString.call(arguments))})() //"[object Arguments]"Object.prototype.toString.call(new Error) //"[object Error]"Object.prototype.toString.call(Math) //"[object Math]"Object.prototype.toString.call({}) //"[object Object]"

利用这个个性,能够写出一个比 typeof 运算符更精确的类型判断函数。

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

type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"

残缺办法

const type = (function() {
  const obj = {
    type_arr: [
      "Number",
      "String",
      "Boolean",
      "Undefined",
      "Null",
      "Symbol",
      "Array",
      "Function",
      "Date",
      "RegExp",
      "Arguments",
      "Error",
      "Math",
      "Object",
    ],
    getType: function(o) {const s = Object.prototype.toString.call(o);
      return s.match(/\[object (.*?)\]/)[1].toLowerCase();}
  };
  obj.type_arr.forEach(t => {obj['is' + t] = function (o) {return obj.getType(o) === t.toLowerCase();}
  });
  return obj;
})();

type.getType(123); // number
type.isObject({}); // true
type.isNumber(123); // true
type.isRegExp(/abc/); // true

参考:
Object 对象

正文完
 0