新聞中心
在JavaScript中對(duì)于其8種數(shù)據(jù)類型,沒(méi)有直接且全面的檢查數(shù)據(jù)類型的內(nèi)置方法,目前知道的typeof和instanceof都不能完美解決問(wèn)題。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供北屯網(wǎng)站建設(shè)、北屯做網(wǎng)站、北屯網(wǎng)站設(shè)計(jì)、北屯網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、北屯企業(yè)網(wǎng)站模板建站服務(wù),十年北屯做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
本篇將介紹使用Object.prototype.toString如何完美解決此問(wèn)題。首先我們來(lái)看看typeof 和 instanceof的缺點(diǎn)。
typeof操作符
typeof操作符可能是首先想到的。 它適用于number, string, undefined, boolean, symbol, function,但在使用typeof時(shí)有一些陷阱需要注意:
1、typeof null === 'object' 是一個(gè)已知的錯(cuò)誤。 null不應(yīng)該是object類型。
2、它除了function,無(wú)法區(qū)分普通對(duì)象和其他內(nèi)置對(duì)象,如下示例。
typeof []; // 'object'typeof {}; // 'object'typeof new Date(); // 'object'typeof /foo/; // 'object'
instanceof操作符
instanceof操作符通過(guò)檢查對(duì)象的構(gòu)造函數(shù),來(lái)確定它是什么類型的,如下示例。
let Car = function () {};let benz = new Car();benz instanceof Car; // true因此,instaceof雖然可以正確地確定對(duì)象的類型,但不能確定基本類型,如下示例。
[] instanceof Array // true(() => {}) instanceof Function; // truenew Map() instanceof Map; // true1 instanceof Number; // false'foo' instanceof String; // false另外,由于instanceof是通過(guò)檢查對(duì)象的構(gòu)造函數(shù)判斷類型的,如果你在運(yùn)行時(shí)修改了對(duì)象的原型,instanceof檢查的結(jié)果可能會(huì)改變:
const array = [];array instanceof Array; // trueObject.setPrototypeOf(array, null);array instanceof Array; // false
正如您所看到的,typeof和instanceof都不是完美的,大多數(shù)時(shí)候人們必須同時(shí)結(jié)合這兩種方法來(lái)進(jìn)行類型檢查。
Object.prototype.toString方法
事實(shí)證明,在JavaScript中還有第三種更好的檢查數(shù)據(jù)類型的方法——Object.prototype.toString。
它是Object.prototype上的一個(gè)方法,結(jié)果返回一個(gè)用于描述對(duì)象的字符串值,如下示例:
Object.prototype.toString.call({}); // "[object Object]"Object.prototype.toString.call(1); // "[object Number]"Object.prototype.toString.call('1'); // "[object String]"Object.prototype.toString.call(true); // "[object Boolean]"Object.prototype.toString.call(new String('string')); // "[object String]"Object.prototype.toString.call(function () {}); // "[object Function]"Object.prototype.toString.call(null); //"[object Null]"Object.prototype.toString.call(undefined); //"[object Undefined]"Object.prototype.toString.call(/123/g); //"[object RegExp]"Object.prototype.toString.call(new Date()); //"[object Date]"Object.prototype.toString.call([]); //"[object Array]"Object.prototype.toString.call(document); //"[object HTMLDocument]"Object.prototype.toString.call(window); //"[object Window]可以使用regexp對(duì)其返回的字符串進(jìn)行一些處理,封裝一個(gè)通用的方法,適用于所有類型:
function getType(obj) { const lowerCaseTheFirstLetter = (str) => str[0].toLowerCase() + str.slice(1); // 如果是基本數(shù)據(jù)類型,直接使用typeOf操作符 const type = typeof obj; if (type !== 'object') { return type; } // 對(duì)對(duì)象類型使用 Object.prototype.toString 方法 return lowerCaseTheFirstLetter( Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1') );}getType([]); // "array"getType('123'); // "string"getType(null); // "null"getType(undefined); // "undefined"getType(); // "undefined"getType(function () {}); // "function"getType(/123/g); // "regExp"getType(new Date()); // "date"getType(new Map()); // "map"getType(new Set()); // "set"通過(guò) Object.prototype.toString 就能夠適用于所有數(shù)據(jù)類型的檢查。這也是大部分框架、庫(kù)中常用的方法。
分享題目:JavaScript如何完美地檢查數(shù)據(jù)類型
路徑分享:http://www.fisionsoft.com.cn/article/cdpiggo.html


咨詢
建站咨詢
