Операторы 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(нуль); // Нуль;