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