自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JavaScript 如何完美地檢查數(shù)據(jù)類型

開發(fā) 前端
本篇將介紹使用Object.prototype.toString如何完美解決此問題。首先我們來看看typeof 和 instanceof的缺點。

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

本篇將介紹使用Object.prototype.toString如何完美解決此問題。首先我們來看看typeof 和 instanceof的缺點。

typeof操作符

typeof操作符可能是首先想到的。 它適用于number, string, undefined, boolean, symbol, function,但在使用typeof時有一些陷阱需要注意:

1、typeof null === 'object' 是一個已知的錯誤。 null不應(yīng)該是object類型。

2、它除了function,無法區(qū)分普通對象和其他內(nèi)置對象,如下示例。

typeof []; // 'object'typeof {}; // 'object'typeof new Date(); // 'object'typeof /foo/; // 'object'

instanceof操作符

instanceof操作符通過檢查對象的構(gòu)造函數(shù),來確定它是什么類型的,如下示例。

let Car = function () {};let benz = new Car();benz instanceof Car; // true

因此,instaceof雖然可以正確地確定對象的類型,但不能確定基本類型,如下示例。

[] instanceof Array // ? true(() => {}) instanceof Function; // ? truenew Map() instanceof Map; // ? true1 instanceof Number; // ? false'foo' instanceof String; // ? false

另外,由于instanceof是通過檢查對象的構(gòu)造函數(shù)判斷類型的,如果你在運行時修改了對象的原型,instanceof檢查的結(jié)果可能會改變:

const array = [];array instanceof Array; // ? trueObject.setPrototypeOf(array, null);array instanceof Array; // ? false

正如您所看到的,typeof和instanceof都不是完美的,大多數(shù)時候人們必須同時結(jié)合這兩種方法來進行類型檢查。

Object.prototype.toString方法

事實證明,在JavaScript中還有第三種更好的檢查數(shù)據(jù)類型的方法——Object.prototype.toString。

它是Object.prototype上的一個方法,結(jié)果返回一個用于描述對象的字符串值,如下示例:

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對其返回的字符串進行一些處理,封裝一個通用的方法,適用于所有類型:

function getType(obj) {  const lowerCaseTheFirstLetter = (str) => str[0].toLowerCase() + str.slice(1);  // 如果是基本數(shù)據(jù)類型,直接使用typeOf操作符  const type = typeof obj;  if (type !== 'object') {  return type;  }  // 對對象類型使用 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"

通過 Object.prototype.toString 就能夠適用于所有數(shù)據(jù)類型的檢查。這也是大部分框架、庫中常用的方法。


責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2019-07-19 15:29:50

人工智能大數(shù)據(jù)

2021-08-04 10:40:20

混合IT數(shù)字業(yè)務(wù)CIO

2016-08-18 14:13:55

JavaScript基本數(shù)據(jù)引用數(shù)據(jù)

2010-10-08 15:11:28

JavaScript數(shù)

2021-12-03 15:24:45

Javascript數(shù)據(jù)類型

2011-07-29 10:12:12

JavaScript

2010-10-08 09:02:03

JavaScript基

2018-11-15 09:45:47

JavaScript數(shù)據(jù)類型變量

2017-02-27 08:34:09

JavaScript數(shù)據(jù)引用

2022-03-07 13:58:30

JavaScript原始數(shù)據(jù)前端

2020-12-29 07:56:23

JavaScript數(shù)據(jù)類型 primitive

2019-08-12 11:40:48

數(shù)據(jù)庫SQLite3數(shù)據(jù)類型

2014-01-05 17:08:09

PostgreSQL數(shù)據(jù)類型

2010-07-22 17:57:40

2020-03-20 09:30:03

物聯(lián)網(wǎng)人工智能技術(shù)

2021-02-25 07:08:30

JavaScript 前端面試題

2010-08-10 17:17:59

2010-10-15 13:28:34

MySql數(shù)據(jù)類型

2017-07-10 13:38:07

MySQL數(shù)據(jù)類型整數(shù)類型

2013-07-30 14:48:58

.NET數(shù)據(jù)類型
點贊
收藏

51CTO技術(shù)棧公眾號