Идеальное решение для определения типа данных JavaScript

внешний интерфейс JavaScript

Обнаружение типов данных JavaScript — это сцена, с которой мы часто сталкиваемся в нашей повседневной разработке.Обнаружение небольших типов данных, от базовых типов данных до различных типов справочных данных, — все это знания, которые нам необходимо освоить. В этой главе будут подробно описаны методы обнаружения различных типов данных в JavaScript и, наконец, реализован последний метод обнаружения типов данных.

Рубиновая книга говорит нам, что типы данных в JavaScriptUndefined, Null, Boolean, Number, String, Object, где первые пять — примитивные типы, а Object — ссылочный тип. На самом деле Object также содержит другие, более специфические ссылочные типы, такие какМассив, функция, дата, регулярное выражение, ошибка, аргументыЖдать.

В описании этой главы я буду использовать приведенные выше 12 типов данных в качестве основы для объяснения различных методов обнаружения (на самом деле в JavaScript существует более 12 типов данных, и мы редко сталкиваемся с другими типами данных, поэтому я не буду подробнее здесь. La).

Методы, которые мы обычно используем для обнаружения типов данных:typeofиObject.prototype.toString, давайте подробнее рассмотрим эти два метода.

typeof

Утверждение в MDN заключается в том, что оператор typeof возвращает строку, представляющую тип невычисленного операнда.

Он используется как операнд typeof или typeof(operand), где операнд — это выражение, представляющее объект или примитивное значение, тип которого должен быть возвращен, причем возвращаемое значение представляет собой строчную форму строки, представляющей его тип данных.

Итак, давайте посмотрим непосредственно на приведенные выше 12 типов данных, используя typeof для определения возвращаемых значений:

var und=undefined;
var nul=null;
var boo=true;
var num=1;
var str='xys'
var obj=new Object();
var arr=[1,2,3];
var fun=function(){}
var date=new Date();
var reg = /a/g;
var err=new Error()
var arg;
(function getArg(){
    arg=arguments;
})();

console.log(typeof und);  // undefined
console.log(typeof nul);  // object
console.log(typeof boo);  // boolean
console.log(typeof num);  // number
console.log(typeof str);  // string
console.log(typeof obj);  // object
console.log(typeof arr);  // object
console.log(typeof fun);  // function
console.log(typeof date);  // object
console.log(typeof reg);  // object
console.log(typeof err);  // object
console.log(typeof arg);  // object

Видно, что с помощью метода typeof для определения типов данных можно точно обнаружить большинство базовых типов и вернуть правильную строку (за исключением типа Null, который возвращает строку объекта), в то время как большинство ссылочных типов не могут быть точно обнаружены. , (За исключением того, что тип Function может точно возвращать строку функции, все остальные возвращают строку объекта).

Видно, что метод typeof не может полностью точно определить 12 типов данных в приведенном выше JavaScript.

Object.prototype.toString

Спецификация ES5 описывает Object.prototype.toString следующим образом:

Известно, что Object.prototype.toString в конечном итоге вернет строку в форме [объект, класс], а класс относится к обнаруженному типу данных, который является ключом к нашему суждению о типе данных.

Опять же, давайте посмотрим на использование Object.prototype.toString, указанное выше, чтобы определить, какие 12 типов данных вернутся к каким результатам:

var toString=Object.prototype.toString;

console.log(toString.call(und));  // [object Undefined]
console.log(toString.call(nul));  // [object Null]
console.log(toString.call(boo));  // [object Boolean]
console.log(toString.call(num));  // [object Number]
console.log(toString.call(str));  // [object String]
console.log(toString.call(obj));  // [object Object]
console.log(toString.call(arr));  // [object Array]
console.log(toString.call(fun));  // [object Function]
console.log(toString.call(date));  // [object Date]
console.log(toString.call(reg));  // [object RegExp]
console.log(toString.call(err));  // [object Error]
console.log(toString.call(arg));  // [object Arguments]

Можно видеть, что в строке [object,class], возвращаемой Object.prototype.toString, класс точно представляет тип каждого данных. В отличие от typeof, первая буква строки типа данных, представленной классом, заглавная. В отличие от typeof, который возвращает строчную строку.

Окончательный метод определения типа данных

Из приведенных выше двух методов обнаружения типов данных мы знаем, что typeof может использоваться для обнаружения других базовых типов, кроме типов Null, и может обнаруживать типы данных Function в ссылочных типах, в то время как Object.prototype.toString может обнаруживать все типы данных, поэтому мы можем объединить эти два метода, чтобы получить окончательный метод определения типа данных JavaScript.

/**
 * @desc 数据类型检测
 * @param obj 待检测的数据
 * @return {String} 类型字符串
 */
function type(obj) {
  return typeof obj !== "object" ? typeof obj : Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
}

Индивидуальное определение типов данных

Иногда мы хотим напрямую судить, относятся ли данные к определенному типу, тогда мы можем реализовать эти функции для оценки определенного типа данных отдельно Здесь код реализации каждой функции указан напрямую, и детская обувь может использоваться напрямую.

/**
 * @desc 是否是 Undefined 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isUndefined(obj) {
    return obj === void 0;
}
/**
 * @desc 是否是 Null 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isNull(obj) {
    return obj === null;
}
/**
 * @desc 是否是 Boolean 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isBoolean(obj) {
    return typeof(obj) === 'boolean';
}
/**
 * @desc 是否是 Number 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isNumber(obj) {
    return typeof(obj) === 'number';
}
/**
 * @desc 是否是 String 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isString(obj) {
    return typeof(obj) === 'string';
}
/**
 * @desc 是否是 Object 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]';
}
/**
 * @desc 是否是 Array 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isArray(obj){
    return Array.isArray?Array.isArray(obj):Object.prototype.toString.call(obj) === '[object Array]';
}
/**
 * @desc 是否是 Function 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isFunction(obj){
    return typeof(obj) === 'function';
}
/**
 * @desc 是否是 Date 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isDate(obj){
    return Object.prototype.toString.call(obj) === '[object Date]';
}
/**
 * @desc 是否是 RegExp 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isRegExp(obj){
    return Object.prototype.toString.call(obj) === '[object RegExp]';
}
/**
 * @desc 是否是 Error 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isError(obj){
    return Object.prototype.toString.call(obj) === '[object Error]';
}
/**
 * @desc 是否是 Arguments 类型检测
 * @param obj 待检测的数据
 * @return {Boolean} 布尔值
 */
function isArguments(obj){
    return Object.prototype.toString.call(obj) === '[object Arguments]';
}