
Операторы typeof и instanceof используются для определения типов данных, но сценарии их использования различны, а некоторые детали требуют особого внимания. Давайте разберемся дальше, досконально усвоим этот пункт знаний и больше не будем бояться вопросов интервьюера.
typeof — это унарный оператор, помещаемый перед операндом, который может быть любого типа. Он возвращает строку, описывающую тип операнда. Пожалуйста, посмотрите на каштан:
const type = typeof 'Да здравствует Китай' // строка;
тип 666; //число;
тип true // логическое значение;
тип неопределенный // неопределенный;
тип символа(); // символ
тип 1n // bigint;
тип() => {} // функция
тип []; // объект
тип {}; // объект
typeof new String('xxx'); // объект
typeof null; // object Как видно из приведенных выше примеров, typeof может только точно определить базовые типы данных и функции (функции на самом деле являются объектами и не принадлежат к другому типу данных, но их также можно отличить с помощью typeof) и не может. быть точно определен. Тип исходящих ссылочных данных (все возвращаемые объекты).
Следует отметить, что вызов typeof null возвращает object . Это связано с тем, что специальное значение null считается ссылкой на нулевой объект (также называемый нулевым указателем объекта).
Если вы хотите точно определить ссылочный тип данных, вы можете использовать оператор instanceof .
Оператор instanceof помещается после операнда и перед данным объектом. Он возвращает логическое значение, указывающее, является ли операнд экземпляром данного объекта:
const result = [] instanceof Array // true;
константный человек = функция () {};
константа р = новый человек ();
p экземпляр человека // правда;
const message = новая строка('xxx');
message instanceof String; // истинная typeof вернет базовый тип операнда, instanceof возвращает логическое
значение
.
кроме null) , но невозможно определить ссылочный тип данных (кроме функции),
typeof , и instanceof имеют определенные недостатки и не могут удовлетворить потребности всех сценариев. Если вам нужно универсально определять типы данных, вы можете использовать метод Object.prototype.toString.call() :
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call([]); // "[массив объектов]"
Object.prototype.toString.call(666); // "[Номер объекта]"
Object.prototype.toString.call('xxx'); // "[object String]" Обратите внимание, что этот метод возвращает строку в формате "[object Object]" .
Для более удобного использования мы можем инкапсулировать этот метод:
function getType(value) {
пусть тип = значение типа;
if (type !== 'object') { // Если это базовый тип данных, вернуть непосредственно return type;
}
// Если это ссылочный тип данных, принимается дальнейшее решение, и обычным результатом возврата является return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1');
}
getType(123); // число
getType('xxx'); // строка
getType(() => {}); // функция
getType([]); // Массив
getType({}); // Объект
getType(нуль); // Нуль;