Как JavaScript определяет тип данных? В этой статье мы поделимся с вами 8 способами оценки типов данных в JS, которые могут эффективно помочь в работе и на собеседованиях.

1, тип

  • Распознаются только базовые и ссылочные типы.
  • Примечание: оценка null, NaN, document.all
console.log(typeof null); // object

console.log(typeof NaN); // number

console.log(typeof document.all); // undefined

2, конструктор

  • конструктор указывает на конструктор, который создал объект экземпляра

Обратите внимание, что null и undefined не имеют конструкторов, а конструкторы можно переопределить.

String.prototype.constructor = function fn() {

  return {};

};

 

console.log("Yun".constructor); // [Function: fn]

3、экземпляр

  • Синтаксис: obj instanceof Тип
  • Функция: Чтобы определить, является ли obj экземпляром класса Type, его можно использовать только для оценки справочных данных.
  • Идеи реализации: является ли объект-прототип Type объектом в цепочке прототипов obj
  • Примечание: правый операнд должен быть функцией или классом.

Рукописный экземпляр:

function myInstanceof(Fn, obj) {

  // Get the function display prototype

  const prototype = Fn.prototype;

  // Get the implicit prototype of obj

  let proto = obj.__proto__;

  // traverse the prototype chain

  while (proto) {

    // Check prototype equality

    if (proto === prototype) {

      return true;

    }

    // If it is not equal, continue to search deeper

    proto = proto.__proto__;

  }

  return false;

}

4、прототип

  • Находится ли он в цепочке прототипов экземпляра объекта
  • В основном эквивалентно instanceof
console.log(Object.isPrototypeOf({})); // false

console.log(Object.prototype.isPrototypeOf({})); // true  The left operand is expected to be a prototype, the {} prototype chain finds Object.prototype

5、Объект.прототип.toString

  • Используйте функцию динамической функции this
function typeOf(data) {

  return Object.prototype.toString.call(data).slice(8, -1);

}

 

// test

console.log(typeOf(1)); // Number

console.log(typeOf("1")); // String

console.log(typeOf(true)); // Boolean

console.log(typeOf(null)); // Null

console.log(typeOf(undefined)); // Undefined

console.log(typeOf(Symbol(1))); // Symbol

console.log(typeOf({})); // Object

console.log(typeOf([])); // Array

console.log(typeOf(function () {})); // Function

console.log(typeOf(new Date())); // Date

console.log(typeOf(new RegExp())); // RegExp

6. Утиный набор текста

  • Проверить тип собственных свойств или тип результата выполнения
  • Обычно в качестве альтернативы
  • Пример: p-is-promise и kindof

п-это-обещание:

const isObject = value =>

  value !== null && (typeof value === "object" || typeof value === "function");

 

export default function isPromise(value) {

  return (

    value instanceof Promise ||

    (isObject(value) && typeof value.then === "function" && typeof value.catch === "function")

  );

}

вроде:

function kindof(obj) {

  var type;

  if (obj === undefined) return "undefined";

  if (obj === null) return "null";

 

  switch ((type = typeof obj)) {

    case "object":

      switch (Object.prototype.toString.call(obj)) {

        case "[object RegExp]":

          return "regexp";

        case "[object Date]":

          return "date";

        case "[object Array]":

          return "array";

      }

 

    default:

      return type;

  }

}

7、Символ.toStringTag

  • Принцип: Object.prototype.toString будет читать значение
  • Применимые сценарии: необходимо настроить тип
  • Примечание: совместимость
class MyArray {

  get [Symbol.toStringTag]() {

    return "MyArray";

  }

}

 

const arr = new MyArray();

console.log(Object.prototype.toString.call(arr)); // [object MyArray]

8、Сравнение стоимости

  • Принцип: сравнить с фиксированным значением
  • Применимые сценарии: undefined, window, document, null и т. д.

Подведем итог

Бонус: ES6 Enhanced NaN

NaN и Number.NaN Характеристики

  • typeof с последующим числом
  • удалить нельзя удалить

isNaN

  • Если это не число, если входной результат неявного преобразования равен NaN, он возвращает true, в противном случае он возвращает false.
console.log(isNaN(NaN)); // true

console.log(isNaN({})); // true

Номер.isNaN

  • Проверяет, является ли значение числом и равно ли значение NaN
console.log(Number.isNaN(NaN)); // true

console.log(Number.isNaN({})); // false

Другие способы проверить, является ли NaN

function isNaNVal(val) {

  return Object.is(val, NaN);

}

 

function isNaNVal(val) {

  return val !== val;

}

 

function isNaNVal(val) {

  return typeof val === "number" && isNaN(val);

}

 



if (!("isNaN" in Number)) {

  Number.isNaN = function (val) {

    return typeof val === "number" && isNaN(val);

  };

}

indexOf и включает

  • indexOf не ищет NaN, включает
const arr = [NaN];

 

console.log(arr.indexOf(NaN)); // -1

console.log(arr.includes(NaN)); // true

Наконец, если в приведенной выше статье есть какое-то неясное место, пожалуйста, укажите на него, я надеюсь, что это может помочь всем в определенной степени, и я с нетерпением жду ваших следующих, спасибо за вашу поддержку~





Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .

Заинтересованы в масштабировании запуска вашего программного обеспечения? Ознакомьтесь с разделом Схема.