运用toString要领推断对象范例

typeof操作符是最常见的范例推断要领,但其有局限性,只能推断基础数据范例,关于数组,日期等对象没法辨别,一致显现为object。

typeof []; //object
typeof new Date(); //object

运用toString()能够处理这个题目

toString基础用法

toString()是定义在Object.prototype上的实例要领,一切实例对象继续了该要领,其能够返回一个对象的字符串情势。


{}.toString(); // "[object Object]"
{a:1}.toString(); // "[object Object]"

关于空对象和平常对象,toString要领会继续于Object.prototype.toString,默许返回[object Object],个中第二个Object是该对象的组织函数,那末依据这个值能够推断数据范例。

'abc'.toString(); // "abc"
[1,2].toString(); // "1,2"
new Date().toString(); // "Sun Mar 24 2019 16:08:58 GMT+0800"

但是很明显字符串、数组、Date等对象具有自定义的toString要领,会掩盖Object.prototype.toString要领。

运用call()

能够直接运用Object.prototype.toString要领来取得范例,但由于是在Object对象环境中运用要领,一切对象都邑显现[object Object]。
合营call(),转变toString要领执行时的地点的环境,能够获得对象的准确范例。

Object.prototype.toString.call('') // "[object String]"
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(new Date()) // "[object Date]"

范例推断函数

返回的字符串中去掉前面object就是对象的范例,能够写一个比typeof更好的范例推断函数

function type(object){
  let s = Object.prototype.toString.call(object);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
}
console.log(type(new Date())); // date

上面代码用正则表达式婚配获得范例,然后将范例字符串小写。
革新前面的顺序,能够用遍历数据的体式格局获得推断某种特定的范例数据的要领。

function type(object){
  var s = Object.prototype.toString.call(object);
  return s.match(/\[object (.*?)\]/)[1].toLowerCase();
};
['Null','Undefined','Object','Array','String','Number','Boolean','Function','RegExp'
].forEach(function(t){
    type['is'+t] = function(object){
      return type(object) === t.toLowerCase();
    };
});
console.log(type.isArray([])); // true

参考
https://wangdoc.com/javascrip…

    原文作者:Teletubbies
    原文地址: https://segmentfault.com/a/1190000018631813
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞