Ответ 1
Не существует явного прямого способа проверить, является ли значение объектом, т.е. относится к типу объекта, но есть некоторые надежные способы сделать это. Я написал список в другом ответе, наиболее кратким кажется
function isObject(value) {
return Object(value) === value;
}
Подобная функция была запрошена несколько раз на esdiscuss. Например,
-
Юрий Зайцев "kangax" задается вопросом о правильном способе проверить, является ли значение объектом.
-
- Брендан Эйх: "Мне кажется, мы должны рассмотреть Object.isObject"
- Хорхе: "Почему бы не .isPrimitive()?"
-
- Brendan Eich: "Мы хотим, чтобы sane isObject и isNull предикаты"
- Axel Rauschmayer: "предикаты, такие как isObject() и isPrimitive()"
Фактически, Object.isObject
был предложен как соломенный, и он появился в раннем проекте ES6.
-
TC39 bashing: Обсуждение
Object.isObject
в проекте ES6. -
Насколько примитивны Символы? Bignums? и т.д.: обсуждает
x === Object(x)
Object.isObject
Соломен был в конечном счете отклонен и удален из проекта ES6.
Совсем недавно,
- Предложение ES8: необязательная статическая типизация (Brandon Andrews): включает
Object.isObject
Теперь существует это предложение {tип} Методы, которое включает Object.isObject
среди множества других других проверок.
Таким образом, есть еще надежда, и в итоге у нас может быть что-то вроде этого.
Вышеупомянутое предназначено для тестирования объектов в целом. Если вы не хотите, чтобы вы определили, что для вас означает "простой объект".
Например, вы можете проверить свойство constructor
. Но любой объект может его настроить.
Вы можете использовать Object.prototype.toString
, чтобы получить устаревший ES5 [[Класс]]. Но любой объект может настроить это через Symbol.toStringTag
.
Вы можете проверить значение, возвращаемое [[GetPrototypeOf]]. Но даже экзотические объекты могут позволить их прототип быть изменен на любой произвольный объект или нуль. И объекты Proxy даже имеют полный контроль над этим внутренним методом.
Поэтому, скорее всего, вы не сможете положиться на эти тесты. И добавить что-то к стандарту может быть сложно, потому что разные люди могут хотеть разные вещи.
Что бы я хотел, это какой-то способ проверить, является ли объект обычным. То есть, он имеет поведение по умолчанию для основных внутренних методов, которые должны поддерживаться всеми объектами.
Как только вы узнаете, что объект обычный, вы можете полагаться на такие вещи, как [[GetPrototypeOf]], чтобы настроить тест на ваши вкусы.