Проверьте, является ли значение объектом в JavaScript

Как проверить, является ли значение объектом в JavaScript?


person Danny Fox    schedule 14.12.2011    source источник
comment
Переменная - это переменная. Это может относиться к объекту. Кроме того, вы можете определить объект - как показывают ответы и комментарии, существуют различные противоречащие друг другу определения (например, является ли null объектом).   -  person    schedule 15.12.2011
comment
OP, IMO, вы должны принять ответ @ Daan, поскольку это лучшее решение и должно быть указано выше других ответов, чтобы оно было видно в первую очередь. (Не обижайтесь на тех, у кого тоже есть хорошие ответы.)   -  person tiffon    schedule 18.11.2015
comment
ИМХО, это действительно зависит от того, что вы (тот, кто ищет ответ на этот вопрос) считаете объектом и почему вы его проверяете. На этот вопрос даются разные ответы, если вы пытаетесь отличить массивы (которые являются объектами) от других объектов или если вы пытаетесь отделить скалярные значения от векторов. И следует ли исключать null (это объект, в соответствии с typeof) или функции (которые являются объектами) или нет, это действительно зависит от того, почему вы его проверяете. Вот почему существует так много ответов, и большинство из них в контексте верны.   -  person FrancescoMM    schedule 08.02.2017
comment
const isEmpty = thing = ›{typeof thing === объект? ! вещь || ! Object.keys (вещь) .length:! Thing && thing! == 0};   -  person Mayur S    schedule 27.07.2018
comment
@ user395760 Буквально каждое определение в программировании конфликтует с другим определением. Определение, которое имеет наибольший смысл для OP, - это A javascript object is a javascript object such as '{}'. Объясните мне, почему null вообще считается объектом? Если вы рассматриваете null объект, вы также можете рассматривать каждую отдельную переменную в javascript как object.   -  person ICW    schedule 12.12.2019
comment
Было бы здорово, если бы вы могли начать с того, что именно вы имеете в виду под объектом. (Или прямо скажите, что часть ответа, которую вы ищете, состоит в том, чтобы выявить различные популярные значения слова «это объект», а затем провести различие между ними.) Если этого не сделать, все будут разговаривать друг с другом.   -  person Don Hatch    schedule 26.12.2019
comment
@tiffon Как насчет точного ответа на странице stackoverflow.com/a/52478680/1096194. Я написал это, когда был ошеломлен, увидев объем деталей во многих ответах, получивших наибольшее количество голосов. Я считаю, что он заслуживает большего внимания.   -  person HalfWebDev    schedule 08.06.2020


Ответы (48)


ОБНОВЛЕНИЕ:

Этот ответ является неполным и дает вводящие в заблуждение результаты. Например, null также считается типом object в JavaScript, не говоря уже о некоторых других крайних случаях. Следуйте приведенной ниже рекомендации и переходите к другому наиболее положительному (и правильному!) Ответу:

typeof yourVariable === 'object' && yourVariable !== null

Исходный ответ:

Попробуйте использовать typeof(var) и / или var instanceof something.

РЕДАКТИРОВАТЬ: этот ответ дает представление о том, как исследовать свойства переменной, но это не надежный рецепт (в конце концов, рецепта вообще нет!) Для проверки того, является ли это объектом, далеко не так. Поскольку люди склонны искать что-то, что можно скопировать отсюда, не проводя никаких исследований, я настоятельно рекомендую им обратиться к другому, наиболее положительному (и правильному!) Ответу.

person Michael Krelin - hacker    schedule 14.12.2011
comment
@ MichaelKrelin-hacker: Я постараюсь. ;) А как насчет myvar instanceof(something) или (myvar)instanceof(something)? ;) - person RightSaidFred; 15.12.2011
comment
@ MichaelKrelin-hacker: Для меня это ясно ... typeof x с скобками выглядит как функция, но instanceof нет, что бы вы ни делали. Понятия не имею, почему typeof не является функцией (я не знаю достаточно JS, чтобы решить, может ли это быть). - person maaartinus; 06.04.2014
comment
@maaartinus, как можно было function fntypeof(x){return typeof x}. Более того, у вас может быть function fninstanceof(x,y){return x instanceof y}. Причина, по которой это оператор, вероятно, состоит в том, что он смоделирован после c sizeof, которое происходит во время компиляции. И основная причина использовать обширные круглые скобки в коде для меня заключается в том, что я не всегда помню приоритеты;) - person Michael Krelin - hacker; 06.04.2014
comment
Это неверный ответ. typeof возвращает "объект" для null, который не является объектом, и instanceof не работает для объектов, созданных с использованием Object.create(null). - person Nikolai; 09.04.2014
comment
Учтите с этим утверждением, что массивы тоже являются объектами, поэтому, если ваш код выглядит как typeof (test), а test - это массив, результатом будет объект - person Iran Reyes; 10.02.2015
comment
Массивы также будут возвращаться как объекты, например: someArray instanceof Object //true или typeof someArray === 'object' // true. А как насчет: Object.prototype.toString.call(someObject) === "[object Object]" или "[object Array]", если вы пытаетесь обнаружить массив? - person Con Antonakos; 19.06.2015
comment
@ Джонатан, есть более веские причины отклонить мой ответ, у вас случайно есть военное прошлое? :) - person Michael Krelin - hacker; 08.09.2015
comment
Это не должен быть принятым ответом. Помимо стилистических проблем, поднятых Джонатаном, это просто неверно и не затрагивает очень важные тонкости, например, @ Ответ Мэтта Фенвика. - person last-child; 18.01.2016
comment
не можете добавить лишний фрагмент предложения, объясняющий, как использовать typeof? : [ - person Andrew; 04.03.2016
comment
@ Андрей, прочти следующий ответ, тот, у которого больше голосов и, возможно, он этого заслуживает. - person Michael Krelin - hacker; 05.03.2016
comment
typeof [1, 2, 3] === 'объект' - person Lajos Mészáros; 27.05.2016
comment
@RightSaidFred отличное замечание. Таким образом, для тех, кто хочет использовать круглые скобки для группировки, было бы проще использовать круглые скобки типа (typeof something)==='object' вместо typeof(something)==='object'. - person maurice; 20.07.2016
comment
@maurice, правда, сейчас я этим и занимаюсь большую часть времени. Хотя я все еще ненавижу, когда люди говорят друг другу, какое из технически эквивалентных выражений использовать. Я подавляю желание сделать это, когда он у меня есть (что, по общему признанию, случается часто :)). - person Michael Krelin - hacker; 20.07.2016
comment
foo instanceof Object может возвращать true для функций и объектов, поэтому typeof лучше. - person CStff; 21.12.2016
comment
Этот ответ плох, потому что он не говорит вам о секретной проблеме с нулевым значением в исходном ответе или редактировании, потому что ответ не говорит вам, как даже использовать typeof в исходном ответе или редактировании (с чем сравнивать? ), и потому что при редактировании вы написали столько бесполезного текста, что не улучшили ответ. Проголосуйте против. - person Andrew; 23.12.2016
comment
`(arr [индекс] экземпляр объекта || arr [индекс] экземпляр массива)` === Array instanceof Object - person ; 01.09.2017
comment
согласен с тем, что этот ответ опасно неполный (и, следовательно, неверен в контексте) Ответ Мэтта Фенвика должен быть принятым - person pentaphobe; 04.09.2017
comment
Ознакомьтесь с этой статьей: tobyho.com/2011/01/28/ проверка-типы-в-JavaScript - person Iran Reyes; 20.10.2017
comment
Проголосовали против, потому что вы должны как минимум упомянуть typeof null == "object". - person doubleOrt; 28.12.2017
comment
хороший ресурс о нулевой проблеме: developer.mozilla. org / en-US / docs / Web / JavaScript / Reference / - person Serhat Ates; 15.10.2018
comment
Никогда не говорите конкретно: Шаблон победителя: Попробуйте использовать blabla и / или blabla что-нибудь. РЕДАКТИРОВАТЬ: этот ответ дает представление blabla ... - person ; 27.06.2019
comment
@RightSaidFred, можешь объяснить, почему ты говоришь, что typeof(foo) сбивает людей с толку? Иногда я использую его просто потому, что, как мне кажется, вопрос о том, является ли typeof оператором или функцией, в большинстве случаев не имеет значения, и я не хочу тратить свое время на его поиск, чтобы напомнить себе. Я не думаю, что будет справедливо говорить, что я сбит с толку; Я просто делаю вещи простыми, когда они не должны быть сложными. - person Don Hatch; 26.12.2019
comment
@DonHatch, я думаю, сбиты с толку люди, которые видят код, и очевидно, что это неочевидно с этим синтаксисом. Не уверен, что это будет иметь катастрофические последствия. - person Michael Krelin - hacker; 26.12.2019
comment
Как насчет того, чтобы удалить этот ответ? Нет возможности пометить ответ как устаревший? - person Graham P Heath; 02.06.2020
comment
мы можем проверить массив: var yourVariable = [] typeof yourVariable === 'object' && yourVariable! == null &&! Array.isArray (yourVariable) - person kuldeep chopra; 23.03.2021
comment
Date() будет обнаружен с этим. - person Dimitri Kopriwa; 07.05.2021

Если typeof yourVariable === 'object', это объект или ноль. Если вы хотите исключить null и массив, просто сделайте это typeof yourVariable === 'object' && yourVariable !== null && !Array.isArray(yourVariable).

person Chuck    schedule 14.12.2011
comment
@RightSaidFred: Ну, как сказал Делнан, я думаю, это вопрос определений. На самом деле я был бы склонен сказать, что null - это объект, основанный на заявлении оператора typeof. Но я думаю, вы правы, что это не самое полезное определение. Это просто моя личная ментальная модель языка, где is-object и is-null - два разных флага. - person Chuck; 15.12.2011
comment
Да, я не уверен, что имел в виду delnan, но ECMAScript 5 определяет нулевое значение как примитивное значение, которое представляет намеренное отсутствие какого-либо значения объекта. несмотря на то, что его оператор typeof утверждает иное. Не уверен насчет формулировки в ES3. Это исправлено в ES6. В любом случае null не ведет себя как объект. Ваш yourVariable != null - это общий подход, поэтому +1. - person RightSaidFred; 15.12.2011
comment
@RightSaidFred: Вау, ES3 соглашается. Я всегда просто доверял оператору typeof и считал, что это артефакт влияния Java на объектную систему. Я был явно неправ. - person Chuck; 15.12.2011
comment
Функции также являются объектами и должны быть включены в ваш чек. - person JS_Riddler; 21.12.2012
comment
В этом случае yourVariable !== null было бы лучше? - person hippietrail; 23.05.2013
comment
@RightSaidFred Похоже, что typeof null == 'object' не будет исправлен в ES6. Они сказали: This proposal has been rejected. It was implemented in V8 but it turned out that it broke a lot of existing sites. In the spirit of One JavaScript this is not feasible. - person Konstantin Smolyanin; 03.09.2013
comment
Кто-нибудь знает, почему typeof [1,2] равно object? - person Lewis; 03.08.2014
comment
@Orion простой ответ заключается в том, что массивы считаются объектами. Для более подробного ответа вам нужно будет прочитать typeof, потому что в нем есть несколько особых случаев, которые не обязательно имеют большой смысл. Если вы пытаетесь различать массивы и объекты, которые не являются массивами, то вам определенно не нужно использовать typeof. - person Matt Fenwick; 01.12.2014
comment
Разве не было бы более надежным сделать yourVariable && typeof yourVariable === 'object, чем явно проверять null? Что, если yourVariable равно undefined? - person James; 28.10.2015
comment
Для новичков: JavaScript не знает, что означает If, это должно быть if (в нижнем регистре), иначе вы получите странные ошибки, которые заставят вас вырвать волосы на груди. - person Nick Steele; 08.11.2015
comment
Это также можно использовать как альтернативу для избавления от нулевых значений в некоторых случаях: yourVariable = yourVariable || {}; if (typeof yourVariable === 'object') {// что-то делаем} - person skud; 21.01.2016
comment
@Tresdin Лучше всего запустить Object.prototype.toString.call(yourVar), будучи yourVar тем, что вам нужно проверить. В случае массивов Object.prototype.toString.call([1,2]) возвращает [object Array] - person Jose Rui Santos; 25.02.2016
comment
yourVariable !== null && typeof yourVariable === 'object' && !Array.isArray( yourVariable ) Тип массивов оценивается как "object". Добавлена ​​проверка массивов - person X_Trust; 13.10.2016
comment
typeof [] также является объектом. Итак, как бы мы могли определить разницу без использования instanceof, который работает довольно медленно. - person Urasquirrel; 21.10.2016
comment
Приведенное выше решение не принимает во внимание объект RegExp или Date, если вам нужно поддерживать эти типы объектов, вы сначала захотите выполнить проверку. if( val && type val !== 'object && Object.prototype.toString.call(val) !== '[object RegExp]' && Object.prototype.toString.call(val) !== '[object Date]') {...} - person Troy Watt; 07.11.2017
comment
Проголосовали против, потому что массив также считается объектом, поэтому вам также следует проверить Array.isArray(yourVariable). - person Alexander Flenniken; 30.11.2017
comment
@AlexanderFlenniken В этом нет необходимости, поскольку typeof [] возвращает "object", массивы будут включены в проверку по умолчанию. - person doubleOrt; 28.12.2017
comment
Не работает с функциями (ответ @ Daan, очевидно, лучший). - person doubleOrt; 28.12.2017
comment
Нормальные объекты всегда считаются правдивыми, а null - ложными. Это означает, что вторая версия также может быть записана как typeof yourVariable === 'object' && yourVariable - person 3limin4t0r; 04.06.2019
comment
Все является объектом, поэтому true подойдет. Можно сказать, что функции также являются объектами и должны быть включены. Но у программиста должна быть свобода быть конкретным и исключать возможные функции! Или уметь сортировать объекты по функциям! Или иметь аргумент, который может быть function(){} закрытием или объектом {}. - person ; 27.06.2019
comment
Это ответ, который помог мне проверить, приносит ли загруженный модуль объявленный (должен быть проверен перед) определенный (не функцию, массив или ноль, но) объект . Первый комментарий каждый теперь может пометить как ненужный, потому что на него ответил && yourVariable !== null. И также следует отметить общепринятый ответ, потому что махание рукой - это вообще не ансер. Прочтите еще раз и проснитесь: Попробуйте использовать typeof(var) и / или var instanceof something. РЕДАКТИРОВАТЬ: этот ответ дает идею ... Иногда ответ не получен, потому что никто не ответил. - person ; 27.06.2019
comment
Привет, есть и другие случаи, которые typeof 'object': Buffer, RegExp, Date - person GLAND_PROPRE; 04.12.2019
comment
Это не работает с Map () или другими объектами. Вам нужно использовать Object.prototype.toString.call(obj), если вы хотите проверить, что объект является Object - person Vasiliy Rusin; 21.04.2021

Определим объект в Javascript. Согласно документам MDN, каждое значение является либо объектом или примитив:

примитивное, примитивное значение

Данные, не являющиеся объектом и не имеющие методов. В JavaScript есть 7 примитивных типов данных: строка, число, bigint, логическое значение, неопределенное значение, символ и значение null.

Что такое примитив?

  • 3
  • 'abc'
  • true
  • null
  • undefined

Что такое объект (т.е. не примитив)?

  • Object.prototype
  • everything descended from Object.prototype
    • Function.prototype
      • Object
      • Function
      • function C(){} - пользовательские функции
    • C.prototype -- the prototype property of a user-defined function: this is not Cs prototype
      • new C() -- "new"-ing a user-defined function
    • Math
    • Array.prototype
      • arrays
    • {"a": 1, "b": 2} - объекты, созданные с использованием буквального обозначения
    • new Number(3) - обертки вокруг примитивов
    • ... многое другое ...
  • Object.create(null)
  • все произошло с Object.create(null)

Как проверить, является ли значение объектом

instanceof сам по себе не работает, потому что пропускает два случая:

// oops:  isObject(Object.prototype) -> false
// oops:  isObject(Object.create(null)) -> false
function isObject(val) {
    return val instanceof Object; 
}

typeof x === 'object' не будет работать из-за ложных срабатываний (null) и ложных срабатываний (функции):

// oops: isObject(Object) -> false
function isObject(val) {
    return (typeof val === 'object');
}

Object.prototype.toString.call не будет работать из-за ложных срабатываний всех примитивов:

> Object.prototype.toString.call(3)
"[object Number]"

> Object.prototype.toString.call(new Number(3))
"[object Number]"

Поэтому я использую:

function isObject(val) {
    if (val === null) { return false;}
    return ( (typeof val === 'function') || (typeof val === 'object') );
}

Ответ @ Даана тоже, похоже, работает:

function isObject(obj) {
  return obj === Object(obj);
}

потому что, согласно документам MDN:

Конструктор Object создает оболочку объекта для данного значения. Если значение равно null или undefined, он создаст и вернет пустой объект, в противном случае он вернет объект типа, который соответствует заданному значению. Если значение уже является объектом, оно вернет значение.


Третий способ, который кажется работающим (не уверен, что он на 100%), - использовать Object.getPrototypeOf which вызывает исключение, если его аргумент не является объектом:

// these 5 examples throw exceptions
Object.getPrototypeOf(null)
Object.getPrototypeOf(undefined)
Object.getPrototypeOf(3)
Object.getPrototypeOf('abc')
Object.getPrototypeOf(true)

// these 5 examples don't throw exceptions
Object.getPrototypeOf(Object)
Object.getPrototypeOf(Object.prototype)
Object.getPrototypeOf(Object.create(null))
Object.getPrototypeOf([])
Object.getPrototypeOf({})
person Matt Fenwick    schedule 18.03.2014
comment
Обратите внимание, что проверка, является ли typeof объектом или функцией, может не работать с объектами хоста, которым разрешено возвращать другие вещи, например в объектах IE ActiveX, используемых для возврата unknown. - person Oriol; 16.06.2015
comment
obj === Object(obj) возвращает true для массивов. - person Onur Yıldırım; 15.02.2016
comment
Массивы @Illuminator являются объектами в Javascript, как я уже упоминал в своем ответе. - person Matt Fenwick; 08.04.2016
comment
@MattFenwick ОК. Итак, лучшее решение - это ваша функция (function isObject(val) { if (val === null) ...). Я правильно понимаю? - person Illuminator; 09.04.2016
comment
new Number(3) - это объект, а не примитив, поэтому его не должно быть в списке примеров ложных срабатываний. - person Macil; 10.06.2016
comment
getPrototypeOf не работает, например с отозванными прокси, которые являются объектами, но бросают. - person Oriol; 28.08.2016
comment
Дихотомия объект / примитив сбивает с толку и кажется произвольной. Самое четкое определение, которое влияет на то, как мы кодируем, - это то, имеет ли что-то семантику значений при передаче копии / аргумента или нет. Другими словами, если я создаю новую привязку let b = a или передаю a в качестве аргумента в вызове функции foo(a), могу ли я изменить a с помощью новой привязки b или изнутри функции foo? В этом свете становится ясно, почему функции, объекты и массивы являются объектами, тогда как строки, числа, null, undefined, NaN являются примитивами. Просто мой 2с. - person Marcus Junius Brutus; 12.12.2016
comment
Почему бы не ({}).toString.apply(obj) === '[object Object]' это различать массивы и объекты, которые не являются массивами - person MauricioJuanes; 07.11.2018
comment
val instanceof Object возвращает истину для массивов. - person Илья Зеленько; 24.12.2018
comment
Подход typeof выглядит намного быстрее, чем === Object (..) jsbench.me/epk80dx8xr/1 - person Yuri Gor; 20.03.2020

underscore.js предоставляет следующий метод, чтобы узнать, что-то действительно является объектом:

_.isObject = function(obj) {
  return obj === Object(obj);
};

ОБНОВЛЕНИЕ

Из-за предыдущей ошибки в V8 и незначительной оптимизации скорости на микро-скорости этот метод выглядит следующим образом, поскольку underscore.js 1.7.0 (август 2014 г.):

_.isObject = function(obj) {
  var type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
};
person Daan    schedule 05.02.2013
comment
В javascript массив также является объектом, поэтому большую часть времени вы хотите исключить массив: return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]' - person Daan; 12.07.2013
comment
зачем вам исключать массив? Это полноценные объекты. - person Nikolai; 09.04.2014
comment
Поскольку в большинстве случаев вы хотите отличать {} от [], например, как входные данные в функции - person Daan; 09.04.2014
comment
@Nickolai ..и для перебора вложенных объектов. - person Ricky Boyce; 22.05.2014
comment
Это лучший ответ. Object преобразуется в объект, а === гарантирует, что obj является тем же объектом. - person Oriol; 16.06.2015
comment
Отличный ответ. Обрабатывает null тоже. Должен быть принятый ответ. - person tiffon; 17.11.2015
comment
@Daan Вот почему у нас есть _.isPlainObject(). - person samvv; 23.06.2016
comment
Мой ответ более полный, но это единственный среди других, который правильно работает для всех возможных значений. Надеюсь, знак щедрости выделит этот ответ и достигнет вершины. - person Oriol; 04.09.2016
comment
Ничего не работает для всех. Некоторые объекты итерируемы и должны обрабатываться как массивы, даже если они являются объектами, в зависимости от приложения. - person Samuel Danielson; 04.03.2017
comment
Не могу поверить, что это оказалось на второй странице. Это самый быстрый и эффективный способ убедиться, что использование оператора in не вызовет ошибки. - person Domino; 03.11.2018
comment
Итак, теперь мы можем установить Underscore.js и использовать _.isObject(x) && typeof x !== 'function', чтобы проверить, является ли x объектом и ничем другим: P - person ; 26.06.2019
comment
Технически это не ванильный javascript, на котором фокусируется это переполнение - это код, написанный кем-то другим, по сути, на JS, который не будет работать без включения Underscore. Может быть, должны быть переполнения (это вообще термин здесь?) Для основных фреймворков и библиотек, таких как JQuery, Underscore и т. Д. - person Netside; 13.07.2020

Object.prototype.toString.call(myVar) вернет:

  • "[object Object]" если myVar - объект
  • "[object Array]" если myVar - это массив
  • и т.п.

Для получения дополнительной информации об этом и о том, почему это хорошая альтернатива typeof, прочтите эту статью.

person Christophe    schedule 13.11.2012
comment
Недавно я узнал, что typeof [] === 'object' - ›true. Вот для чего нужен этот метод. - person Jondlm; 11.08.2013
comment
@Christophe Не делает различий между примитивами и объектами. Object.prototype.toString.call(3) - ›"[object Number]". Object.prototype.toString.call(new Number(3)) - ›"[object Number] - person Matt Fenwick; 18.03.2014
comment
@MattFenwick Я не думаю, что это тот объект, который OP пытается идентифицировать - person Christophe; 19.03.2014
comment
@Christophe, почему ты так думаешь? IMHO, в отсутствие какого-либо другого определения, данного OP для объекта, мне кажется наиболее разумным пойти с тем, которое последовательно используется во всей спецификации ECS. - person Matt Fenwick; 19.03.2014
comment
Многие типы объектов дают разные результаты, такие как «[дата объекта]» или «[ошибка объекта]». - person Macil; 10.06.2016
comment
@AgentME, да, их гораздо больше. Я просто сказал и т. Д., Перечисление их всех не добавит особой ценности моему ответу. - person Christophe; 11.06.2016
comment
Я хотел сказать, что если кто-то хочет обнаруживать объекты, включая даты, ошибки и все остальное, то сравнение с [object Object] не сработает. - person Macil; 15.06.2016
comment
это даже лучше: Object.prototype.toString.call(val).slice(8, -1); - person Madeo; 24.05.2021

Для простой проверки объекта или массива без дополнительного вызова функции (скорость). Также опубликовано здесь.

isArray ()

isArray = function(a) {
    return (!!a) && (a.constructor === Array);
};
console.log(isArray(        )); // false
console.log(isArray(    null)); // false
console.log(isArray(    true)); // false
console.log(isArray(       1)); // false
console.log(isArray(   'str')); // false
console.log(isArray(      {})); // false
console.log(isArray(new Date)); // false
console.log(isArray(      [])); // true

isLiteralObject () - Примечание: используйте только для литералов Object, поскольку он возвращает false для настраиваемых объектов, таких как new Date или new YourCustomObject.

isLiteralObject = function(a) {
    return (!!a) && (a.constructor === Object);
};
console.log(isLiteralObject(        )); // false
console.log(isLiteralObject(    null)); // false
console.log(isLiteralObject(    true)); // false
console.log(isLiteralObject(       1)); // false
console.log(isLiteralObject(   'str')); // false
console.log(isLiteralObject(      [])); // false
console.log(isLiteralObject(new Date)); // false
console.log(isLiteralObject(      {})); // true
person zupa    schedule 17.05.2013
comment
isObject работает только с объектными литералами. Если я создаю настраиваемый тип, создаю экземпляр типа и тестирую его, он возвращает false - person WickyNilliams; 02.12.2013
comment
@WickyNilliams, это правда, тестовый new Date был призван подчеркнуть это. Добавлен акцент в виде примечания, спасибо - person zupa; 02.12.2013
comment
@zupa: что !! a делает? - person ; 23.04.2015
comment
@ 3000 !!a - это приведение логического типа в JS. !a отрицает a, !!a двойное отрицание. - person zupa; 27.04.2015
comment
@zupa: так зачем ты этим пользуешься? Это то, чего я не понимаю - person ; 27.04.2015
comment
@ 3000 Ты собираешься предложить альтернативу? Вперед, продолжать. Или уточните свой вопрос, поскольку я озадачен. Моей первой мыслью было реализовать эту функцию. - person zupa; 27.04.2015
comment
@zupa: абсолютно нет. Мне просто было любопытно, так как я не понимаю, ПОЧЕМУ ты это сделал, вот и все :-) - person ; 27.04.2015
comment
@ 3000 ну, если мы опустим часть (!! a), произойдет сбой, потому что null и undefined не имеют конструкторов. (!! a) отфильтровывает их. Это ответ на ваш вопрос? - person zupa; 27.04.2015
comment
@ 3000 - re: (!!a) - оператор ! является логическим отрицанием. поэтому в псевдокоде это not(not(a)), поэтому, если a относится к false (любому из null, false, 0, ""), то результатом будет false. это a не имеет отношения к false, тогда результат будет true. - person Jesse Chisholm; 08.05.2015
comment
@zupa @ 3000 Boolean(a) длиннее, но гораздо интуитивно понятнее. Только не используйте new Boolean(a): (вот почему)! - person Jeroen Versteeg; 20.08.2015
comment
Удивлен, что лучший ответ пока что внизу страницы. Это в основном отвечает на вопрос - будет ли это представлено в JSON как что-то, начинающееся с символа {. В случае с массивом, если вам не нужна поддержка IE ‹9, вы можете использовать Array.isArray(), чтобы определить, является ли что-то массивом. Он проходит все предоставленные вами тестовые примеры. - person Kip; 10.03.2016
comment
@Kip Это не отвечает на вопрос, будет ли это представлено в JSON как что-то, начинающееся с символа {. class Foo { }; var x = new Foo(); x.someProperty = 1; JSON.stringify({test: x}) // returns '{"test":{"someProperty":1}}'. Это проверяет, равен ли конструктор Object (что определенно не верно для всех объектов). Но это не критерий кодирования фигурных скобок JSON. - person Yetanotherjosh; 13.01.2018
comment
@zupa @ 3000 @JayVee return a && (a.constructor === Object); тоже работает. Я не вижу необходимости в двойном отрицании - person Brad Kent; 03.07.2019
comment
@BradKent Без двойного отрицательного значения !!a isObject(null) вернет null вместо false - person AKG; 14.08.2019
comment
Как насчет Object.create(null)? (ОШИБКА) - person Do Async; 14.04.2020
comment
isObject не работает для Object.create(null), и не работает для document.all (по неправильной причине). Зачем исключать функции и объекты других прототипов? - person Sebastian Simon; 14.05.2020

Люблю просто:

function isObject (item) {
  return (typeof item === "object" && !Array.isArray(item) && item !== null);
}

Если элемент является объектом JS, и это не массив JS, и это не null… если все три подтверждаются, вернуть true. Если какое-либо из трех условий не выполняется, тест && будет закорочен, и будет возвращено false. При желании null тест можно опустить (в зависимости от того, как вы используете null).

ДОКУМЕНТЫ:

http://devdocs.io/javascript/operators/typeof

http://devdocs.io/javascript/global_objects/object

http://devdocs.io/javascript/global_objects/array/isarray

http://devdocs.io/javascript/global_objects/null

person 2540625    schedule 07.09.2014
comment
А как насчет console.log (isObject (new Date ()))? Почему дата должна быть объектом, а массив - нет? - person schirrmacher; 28.06.2015
comment
@ 1101: Думаю, мне не нужен этот крайний случай. Мне любопытно, есть ли у вас? Я полагаю, тогда я бы добавил к возвращенному короткому замыканию && !(item instance of Date) или, возможно, && Object.prototype.toString.call(item) !== '[object Date]', если границы кадра вызывают беспокойство. Хм ... - person 2540625; 29.06.2015
comment
@macher Потому что new Date() возвращает объект. С логической точки зрения массив не является объектом, хотя JavaScript обрабатывает их и сообщает о них как таковые. Однако на практике видеть их равными бесполезно, потому что это не так. Например, объект не имеет атрибута length и таких методов, как push (). И иногда вам может потребоваться указать перегруженные параметры функции, где вам нужно различать массив или объект, особенно если другие параметры зависят от того, какой из них был задан. - person StanE; 06.08.2016
comment
@StanE Массивы определенно являются объектами. Не уверен, почему вы думаете, что объекты не могут иметь свойство length, а такие методы, как push, Object.create(Array.prototype) - тривиальный контрпример объекта, не являющегося массивом, у которого они есть. Особенность массивов заключается в том, что они являются экзотическими объектами с настраиваемым внутренним методом [[DefineOwnProperty]], но они по-прежнему являются объектами. - person Oriol; 28.08.2016
comment
@Oriol Я не писал, что массивы не являются объектами, и не писал, что объекты не могут иметь свойство length (я имел в виду, что литералы объектов по умолчанию не имеют атрибута length). Я писал, что массивы не являются объектами с логической точки зрения. Я говорю о программной логике. Иногда необходимо проверить, является ли массив реальным массивом, а не реальным объектом. Для этого Array.isArray(). Представьте, что у вас есть функция, которая принимает объект или массив объектов. Проверка на специальный атрибут или метод - грязное решение. Родной способ всегда лучше. - person StanE; 30.08.2016
comment
@Oriol, ваш пример (Object.create(Array.prototype)) может быть не лучшим, поскольку он instanceof Array и такие методы, как .push, будут работать, как будто это массив. - person Camilo Martin; 07.09.2016
comment
@CamiloMartin Я привел контрпример объекта, не являющегося массивом, подобного массиву, чтобы продемонстрировать, что объект A [non-array?], Например, не имеет атрибута длины и не имеет таких методов, как push (), явно ложный. Мой пример был намеренно подобен массиву, но это не массив. instanceof проверяет только наследование, но не поведение. А методы массива, такие как push, намеренно универсальны, они не требуют объектов массива. - person Oriol; 07.09.2016
comment
На мой взгляд, это лучший ответ. && item !== null не имеет смысла, поскольку, если элемент равен null, тогда typeof item будет равно "undefined", поэтому typeof item === "object" все равно вернет false. - person Daniel Tonon; 01.10.2016
comment
typeof null - это "object", а не "undefined". - person 2540625; 02.10.2016
comment
Это будет true для RegExp. - person yckart; 17.06.2017
comment
Это также true для Blob - person Joyce; 09.02.2018

С функцией Array.isArray:

function isObject(o) {
  return o !== null && typeof o === 'object' && Array.isArray(o) === false;
}

Без функции Array.isArray:

Просто удивился, сколько голосов за неправильные ответы ????
Только 1 ответ прошел мои тесты !!! Здесь я создал свою упрощенную версию:

function isObject(o) {
  return o instanceof Object && o.constructor === Object;
}

Как по мне, это понятно и просто, и просто работает! Вот мои тесты:

console.log(isObject({}));             // Will return: true
console.log(isObject([]));             // Will return: false
console.log(isObject(null));           // Will return: false
console.log(isObject(/.*/));           // Will return: false
console.log(isObject(function () {})); // Will return: false

ЕЩЕ ОДИН РАЗ: не все ответы проходят этот тест !!! ????


Если вам нужно убедиться, что объект является экземпляром определенного класса, вы должны проверить конструктор с вашим конкретным классом, например:

function isDate(o) {
  return o instanceof Object && o.constructor === Date;
}

простой тест:

var d = new Date();
console.log(isObject(d)); // Will return: false
console.log(isDate(d));   // Will return: true

В результате у вас будет строгий и надежный код!


Если вы не будете создавать такие функции, как isDate, isError, isRegExp и т. Д., Вы можете рассмотреть вариант использования этих обобщенных функций:

function isObject(o) {
  return o instanceof Object && typeof o.constructor === 'function';
}

он не будет работать правильно для всех тестовых случаев, упомянутых ранее, но его достаточно для всех объектов (простых или сконструированных).


isObject не будет работать в случае Object.create(null) из-за внутренней реализации Object.create, которая объясняется здесь, но вы можете использовать isObject и в других случаях. продуманная реализация:

function isObject(o, strict = true) {
  if (o === null || o === undefined) {
    return false;
  }
  const instanceOfObject = o instanceof Object;
  const typeOfObject = typeof o === 'object';
  const constructorUndefined = o.constructor === undefined;
  const constructorObject = o.constructor === Object;
  const typeOfConstructorObject = typeof o.constructor === 'function';
  let r;
  if (strict === true) {
    r = (instanceOfObject || typeOfObject) && (constructorUndefined || constructorObject);
  } else {
    r = (constructorUndefined || typeOfConstructorObject);
  }
  return r;
};

Уже создан пакет для npm v1 на основе этой реализации! И это работает для всех ранее описанных тестовых случаев! ????

person cn007b    schedule 10.10.2017
comment
лучший ответ! работает во многих случаях, упомянутых здесь - person prieston; 20.10.2017
comment
Поскольку это возвращает false для isObject (myDateObject), это не ответ на вопрос. Он не сообщает, является ли переменная объектом, только если это объект определенного класса. Здесь вопрос касается универсальной функции, которая возвращает истину для любого объекта. - person Yetanotherjosh; 13.01.2018
comment
@Yetanotherjosh Это действительно ответ ???? вы упомянули случай, который описан в ответе, и суть - вы должны использовать isDate для yourDateObject с целью написания надежного кода, иначе у вас будет хрупкий метод isObject. - person cn007b; 19.01.2018
comment
@VladimirKovpak Использование Date в моем комментарии было неудачно выбрано, потому что да, ответ действительно обсуждает Date. Но Date - всего лишь один из бесконечного числа возможных классов, и дело обстоит так и с любым другим классом. Пример: class Foo() { }; var x = new Foo(); isObject(x) возвращает false. Я не знаю точно, каков вариант использования OP, но легко представить себе сценарии, в которых нужно знать о всех возможных классах и проверять конкретно на каждый из них будет неосуществимо. - person Yetanotherjosh; 20.01.2018
comment
@Yetanotherjosh Я обновил свой ответ. И добавил еще 1 чехол. - person cn007b; 20.01.2018
comment
Использование instanceof не работает для объектов, созданных из Object.create(null). - person CMCDragonkai; 11.02.2018
comment
@CMCDragonkai Спасибо за этот случай! Я обновил ответ, а также создал пакет в npm. - person cn007b; 12.02.2018

О мой Бог! Я думаю, это могло бы быть короче, чем когда-либо, давайте посмотрим на это:

Краткий и окончательный код

function isObject(obj)
{
    return obj != null && obj.constructor.name === "Object"
}

console.log(isObject({})) // returns true
console.log(isObject([])) // returns false
console.log(isObject(null)) // returns false

Объяснил

Типы возврата

typeof объектов JavaScript (включая null) возвращает "object"

console.log(typeof null, typeof [], typeof {})

Проверка их конструкторов

Проверка их свойства constructor возвращает функцию с их именами.

console.log(({}).constructor) // returns a function with name "Object"
console.log(([]).constructor) // returns a function with name "Array"
console.log((null).constructor) //throws an error because null does not actually have a property

Представляем Function.name

Function.name возвращает имя функции только для чтения или "anonymous" для замыканий.

console.log(({}).constructor.name) // returns "Object"
console.log(([]).constructor.name) // returns "Array"
console.log((null).constructor.name) //throws an error because null does not actually have a property

Примечание. По состоянию на 2018 год Function.name может не работать в IE https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Browser_compatibility < / а>

person Erisan Olasheni    schedule 21.07.2018
comment
Мне очень нравится этот, краткий и точный. Насколько я могу судить, он терпит неудачу только в одном. если obj = Object.create(null), и почему вы все равно это сделаете ...? - person Julian Knight; 17.02.2020

Хорошо, давайте сначала дадим вам эту концепцию, прежде чем отвечать на ваш вопрос, в функциях JavaScript являются Object, а также null, Object, Arrays и даже Date, поэтому, как вы видите, нет простого способа, такого как typeof obj = == 'object', поэтому все вышеупомянутое вернет истину, но есть способы проверить это, написав функцию или используя фреймворки JavaScript, ОК:

Теперь представьте, что у вас есть этот объект, который является реальным объектом (не нулем, функцией или массивом):

var obj = {obj1: 'obj1', obj2: 'obj2'};

Чистый JavaScript:

//that's how it gets checked in angular framework
function isObject(obj) {
  return obj !== null && typeof obj === 'object';
}

or

//make sure the second object is capitalised 
function isObject(obj) {
   return Object.prototype.toString.call(obj) === '[object Object]';
}

or

function isObject(obj) {
    return obj.constructor.toString().indexOf("Object") > -1;
}

or

function isObject(obj) {
    return obj instanceof Object;
}

Вы можете просто использовать одну из этих функций, как указано выше, в своем коде, вызывая их, и она вернет true, если это объект:

isObject(obj);

Если вы используете фреймворк JavaScript, они обычно подготовили для вас такие функции, вот некоторые из них:

jQuery:

 //It returns 'object' if real Object;
 jQuery.type(obj);

Угловой:

angular.isObject(obj);

Подчеркивание и Лодаш:

//(NOTE: in Underscore and Lodash, functions, arrays return true as well but not null)
_.isObject(obj);
person Alireza    schedule 15.02.2017
comment
Вы также хотите убедиться, что это не массив. поэтому функция isObject (obj) {return obj! == null && typeof obj === 'объект' &&! Array.isArray (obj); } - person Matt Goo; 03.04.2017
comment
Я согласен с вами, но, как вы видите в комментарии, именно так это делается в angularJs, и я упоминаю об этом в комментарии перед функцией, они считают массив как объект ... подробнее см. Здесь: docs.angularjs.org/api/ng/function/angular.isObject - person Alireza; 04.04.2017

Это зависит от того, что вы имеете в виду под словом «объект». Если вам нужно все, что не является примитивом, т.е. вещи, для которых вы можете установить новые свойства, это должно помочь:

function isAnyObject(value) {
    return value != null && (typeof value === 'object' || typeof value === 'function');
}

Он исключает примитивы (простые числа / _2 _ / _ 3_, простые строки, символы, _4 _ / _ 5_, undefined и null), но должен возвращать истину для всего остального (включая объекты Number, Boolean и String). Обратите внимание, что JS не определяет, какие объекты «хоста», такие как window или console, должны возвращаться при использовании с typeof, поэтому их трудно покрыть такой проверкой.

Если вы хотите узнать, является ли что-то «простым» объектом, т. Е. Было создано как литерал {} или с помощью Object.create(null), вы можете сделать следующее:

function isPlainObject(value) {
    if (Object.prototype.toString.call(value) !== '[object Object]') {
        return false;
    } else {
        var prototype = Object.getPrototypeOf(value);
        return prototype === null || prototype === Object.prototype;
    }
}

Изменить 2018: поскольку Symbol.toStringTag теперь позволяет настраивать вывод Object.prototype.toString.call(...), isPlainObject функция может возвращать false в некоторых случаях, даже когда объект начал свою жизнь как литерал. Возможно, по соглашению объект с настраиваемым строковым тегом уже не совсем простой объект, но это еще больше запутало определение того, что такое простой объект даже в Javascript.

person last-child    schedule 18.01.2016
comment
Почему typeof === 'function' считается объектом? Функция - это не объект, не так ли? new myFunc () станет объектом, да, но простой функцией? - person StanE; 06.08.2016
comment
Нет, каждая функция является объектом в Javascript, независимо от того, как она была создана. Вы можете установить для них свойства (если они не заморожены), они равны instanceof Object, два идентичных функциональных литерала не строго равны, они передаются по ссылке и т. Д. - person last-child; 29.10.2016

Боже мой, слишком много путаницы в других ответах.

Короткий ответ

typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array)

Чтобы проверить это, просто запустите следующие операторы в консоли Chrome.

Случай 1.

var anyVar = {};
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // true

Случай 2.

anyVar = [];
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array) // false

Случай 3.

anyVar = null;
typeof anyVar == 'object' && anyVar instanceof Object && !(anyVar instanceof Array); // false

Объяснение

Хорошо, давай разберемся

typeof anyVar == 'object' возвращается истина из трех кандидатов - [], {} and null,

anyVar instanceof Object сокращает число этих кандидатов до двух - [], {}

!(anyVar instanceof Array) сужается до одного - {}

Барабан, пожалуйста!

К этому вы, возможно, уже узнали, как проверять массив в Javascript.

person HalfWebDev    schedule 24.09.2018
comment
Следует отметить, что это также возвращает false (по желанию), когда anyVar является функцией. - person Jamie Birch; 12.02.2019
comment
Хороший ответ @HalfWebDev, но для обслуживания функций, как прокомментировал Джейми Берч, мы можем сделать этот тип anyVar == 'object' && anyVar instanceof Object &&! (AnyVar instanceof Array) && typeof anyVar! == 'function' - person Sandeep Amarnath; 02.05.2021

Наиболее разумным способом проверки типа значения является оператор typeof. Единственная проблема в том, что он ужасно сломан:

  • Он возвращает "object" для null, который принадлежит к типу Null.
  • Он возвращает "function" для вызываемых объектов, принадлежащих к типу Object.
  • Он может вернуть (почти) все, что захочет, для нестандартных не вызываемых объектов. Например, IE понравился "unknown". Единственные запрещенные результаты - это "function" и примитивные типы.

typeof надежен только для не null примитивов. Таким образом, способ проверить, является ли значение объектом, заключается в том, чтобы убедиться, что строка, возвращаемая typeof, не соответствует примитиву, и что объект не является null. Однако проблема в том, что будущий стандарт может ввести новый примитивный тип, и наш код будет рассматривать его как объект. Новые типы появляются не часто, но, например, в ECMAScript 6 появился тип символа.

Поэтому вместо typeof я рекомендую только подходы, результат которых зависит от того, является ли значение объектом или нет. Следующее намерено стать

Исчерпывающий, но не исчерпывающий список правильных способов проверить, принадлежит ли значение типу Object.

  • Object конструктор

    Конструктор Object приводит переданный аргумент к объекту. Если это уже объект, возвращается тот же объект.

    Следовательно, вы можете использовать его для приведения значения к объекту и строго сравнивать этот объект с исходным значением.

    Для следующей функции требуется ECMAScript 3, в котором введен ===:

    function isObject(value) { /* Requires ECMAScript 3 or later */
      return Object(value) === value;
    }
    

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

  • Конструкторы

    Когда вы создаете экземпляр конструктора, он может возвращать значение, отличное от только что созданного экземпляра. Но это значение будет проигнорировано, если оно не является объектом.

    Следующая функция требует ECMAScript 3, который позволяет конструкторам возвращать не объекты. До ECMAScript 3 это выдавало ошибку, но операторов try тогда не существовало.

    function isObject(value) { /* Requires ECMAScript 3 or later */
      return new function() { return value; }() === value;
    }
    

    Хотя этот пример немного менее прост, чем предыдущий, он не полагается на какое-либо глобальное свойство и, следовательно, может быть самым безопасным.

  • this значение

    Старые спецификации ECMAScript требовали, чтобы значение this было объектом. ECMAScript 3 представил Function.prototype.call, который позволял вызывать функцию с произвольным значением this, но с принуждением к объекту.

    ECMAScript 5 представил строгий режим, который устранил это поведение, но в небрежном режиме мы все еще можем (но, возможно, не должны) полагаться на него.

    function isObject(value) { /* Requires ECMAScript 3 or later in sloppy mode */
      return function() { return this === value; }.call(value);
    }
    
  • [[Прототип]]

    Все обычные объекты имеют внутренний слот под названием [[Prototype]], значение которого определяет, от какого другого объекта он наследуется. Значение может быть только объектом или null. Следовательно, вы можете попытаться создать объект, наследующий желаемое значение, и проверить, сработало ли оно.

    И Object.create, и Object.getPrototypeOf требуют ECMAScript 5.

    function isObject(value) { /* Requires ECMAScript 5 or later */
      try {
        Object.create(value);
        return value !== null;
      } catch(err) {
        return false;
      }
    }
    
    function isObject(value) { /* Requires ECMAScript 5 or later */
      function Constructor() {}
      Constructor.prototype = value;
      return Object.getPrototypeOf(new Constructor()) === value;
    }
    
  • Некоторые новые способы ECMAScript 6

    ECMAScript 6 вводит несколько новых косвенных способов проверки того, является ли значение объектом. Они используют ранее рассмотренный подход для передачи значения в некоторый код, которому требуется объект, заключенный внутри оператора try для обнаружения ошибок. Некоторые скрытые примеры, не стоит комментировать

    function isObject(value) { /* Requires ECMAScript 6 or later */
      try {
        Object.setPrototypeOf({}, value);
        return value !== null;
      } catch(err) {
        return false;
      }
    }

    function isObject(value) { /* Requires ECMAScript 6 or later */
      try {
        new WeakSet([value]);
        return true;
      } catch(err) {
        return false;
      }
    }


Примечание: я намеренно пропустил некоторые подходы, такие как Object.getPrototypeOf(value) (ES5) и Reflect (ES6), потому что они вызывают важные внутренние методы, которые могут делать неприятные вещи, например если value - прокси. Из соображений безопасности мои примеры ссылаются только на value, не обращаясь к нему напрямую.

person Oriol    schedule 28.08.2016
comment
Только мой ответ и ответ Даана полностью верны. это немного самонадеянно, учитывая, что я полностью не согласен с вашими первыми двумя предложениями. - person zzzzBov; 02.09.2016
comment
@zzzzBov Ну, я просмотрел все ответы, и они не гарантируют, что всегда вернут правильный ответ, кроме моего и Даана. Большинству из них я могу привести воспроизводимые контрпримеры. Другие рекомендуют проверять, возвращает ли typeof функцию или объект, но, как я объяснил, спецификация допускает другие результаты для некоторых объектов. Ответ Мэтта Фенвика содержит тот же правильный ответ, что и Даан, но также содержит неправильные. - person Oriol; 02.09.2016
comment
Я не согласен с предположением о том, что ваш ответ является полностью правильным, утверждая, что другие не гарантируют, что всегда будут возвращать правильный ответ, никоим образом не опровергает мою позицию. Кроме того, в вопросе не делается никаких заявлений относительно того, какой ввод какой результат должен давать. - person zzzzBov; 02.09.2016
comment
@zzzzBov Вопрос спрашивает, как проверить, является ли что-то объектом. ECMAScript определяет, что такое объект, поэтому я использую это определение. Другого разумного толкования я не вижу. Ответы, которые делают другие вещи (например, исключают массивы), могут быть полезны в некоторых обстоятельствах, но они не проверяют, является ли что-то объектом. - person Oriol; 02.09.2016
comment
@Oriol Возможно, вы могли бы дать ответ на этот вопрос Почему в JavaScript нет встроенного метода проверки, является ли объект простым?? - person guest271314; 07.11.2016

Немного поздно ... для простых объектов (я имею в виду, например, {'x': 5, 'y': 7}) у меня есть этот небольшой фрагмент:

function isPlainObject(o) {
   return (o === null || Array.isArray(o) || typeof o == 'function' || o.constructor === Date ) ?
           false
          :(typeof o == 'object');
}

Он генерирует следующий вывод:

console.debug(isPlainObject(isPlainObject)); //function, false
console.debug(isPlainObject({'x': 6, 'y': 16})); //literal object, true
console.debug(isPlainObject(5)); //number, false
console.debug(isPlainObject(undefined)); //undefined, false
console.debug(isPlainObject(null)); //null, false
console.debug(isPlainObject('a')); //string, false
console.debug(isPlainObject([])); //array?, false
console.debug(isPlainObject(true)); //bool, false
console.debug(isPlainObject(false)); //bool, false

У меня это всегда срабатывает. If вернет true, только если тип o - объект, но не null, массив или функция. :)

person Emilio Grisolía    schedule 25.10.2015
comment
Как упоминалось в предыдущих ответах, ваш подход не удастся в случае объекта Date. - person Grzegorz Pawlik; 20.03.2017

Готовые функции для проверки

function isObject(o) {
  return null != o && 
    typeof o === 'object' && 
    Object.prototype.toString.call(o) === '[object Object]';
}

function isDerivedObject(o) {
  return !isObject(o) && 
    null != o && 
    (typeof o === 'object' || typeof o === 'function') &&
    /^\[object /.test(Object.prototype.toString.call(o));
}

// Loose equality operator (==) is intentionally used to check
// for undefined too

// Also note that, even null is an object, within isDerivedObject
// function we skip that and always return false for null

Объяснение

  • В Javascript null, Object, Array, Date и functions являются объектами. Хотя, null немного надуманный. Итак, лучше сначала проверить null, чтобы обнаружить, что он не равен нулю.

  • Проверка на typeof o === 'object' гарантирует, что o является объектом. Без этой проверки Object.prototype.toString был бы бессмысленным, поскольку он возвращал бы объект для всего, даже для undefined и null! Например: toString(undefined) возвращает [object Undefined]!

    После typeof o === 'object' проверки toString.call (o) - отличный способ проверить, является ли o объектом, производным объектом, таким как Array, Date или function.

  • В isDerivedObject функции он проверяет, является ли o функцией. Потому что функция также является объектом, поэтому она здесь. Если этого не произошло, функция вернет значение false. Пример: isDerivedObject(function() {}) вернет false, но теперь возвращает true.

  • Всегда можно изменить определение того, что такое объект. Таким образом, можно соответствующим образом изменить эти функции.


Тесты

function isObject(o) {
  return null != o && 
    typeof o === 'object' && 
    Object.prototype.toString.call(o) === '[object Object]';
}

function isDerivedObject(o) {
  return !isObject(o) && 
    null != o && 
    (typeof o === 'object' || typeof o === 'function') &&
    /^\[object /.test(Object.prototype.toString.call(o));
}

// TESTS

// is null an object?

console.log(
  'is null an object?', isObject(null)
);

console.log(
  'is null a derived object?', isDerivedObject(null)
);

// is 1234 an object?

console.log(
  'is 1234 an object?', isObject(1234)
);

console.log(
  'is 1234 a derived object?', isDerivedObject(1234)
);

// is new Number(1234) an object?

console.log(
  'is new Number(1234) an object?', isObject(new Number(1234))
);

console.log(
  'is new Number(1234) a derived object?', isDerivedObject(1234)
);

// is function object an object?

console.log(
  'is (new (function (){})) an object?', 
  isObject((new (function (){})))
);

console.log(
  'is (new (function (){})) a derived object?', 
  isObject((new (function (){})))
);

// is {} an object?

console.log(
  'is {} an object?', isObject({})
);

console.log(
  'is {} a derived object?', isDerivedObject({})
);

// is Array an object?

console.log(
  'is Array an object?',
  isObject([])
)

console.log(
  'is Array a derived object?',
  isDerivedObject([])
)

// is Date an object?

console.log(
  'is Date an object?', isObject(new Date())
);

console.log(
  'is Date a derived object?', isDerivedObject(new Date())
);

// is function an object?

console.log(
  'is function an object?', isObject(function(){})
);

console.log(
  'is function a derived object?', isDerivedObject(function(){})
);

person Inanc Gumus    schedule 17.11.2016
comment
Привет ! Отличный пост, но с небольшой опечаткой, даже если он дает правильный результат: console.log ('is (new (function () {})) производный объект?', IsObject ((new (function () {})))) ; - person virtual_Black_Whale; 07.10.2020

Попробуй это

if (objectName instanceof Object == false) {
  alert('Not an object');
}
else {
  alert('An object');
}
person Talha    schedule 09.05.2012
comment
Почему вы добуле проверяете логические значения? - person jkutianski; 19.12.2013
comment
Это пропускает два случая: Object.prototype instanceof Object - ›false. Object.create(null) instanceof Object - ›ложь. - person Matt Fenwick; 18.03.2014
comment
как насчет дат? new Date() instanceof Object = ›правда - person mauron85; 09.10.2016

Если вы хотите проверить, исходит ли prototype для object исключительно от Object. Отфильтровывает String, Number, Array, Arguments и т. Д.

function isObject (n) {
  return Object.prototype.toString.call(n) === '[object Object]';
}

Или как функция стрелки с одним выражением (ES6 +)

const isObject = n => Object.prototype.toString.call(n) === '[object Object]'
person sasi    schedule 16.04.2018
comment
это лучший способ, но я бы сделал его еще проще, указав во второй строке: return Object.prototype.toString.call(n) === '[object Object]' - person mesqueeb; 10.06.2018
comment
Вы также можете удалить null проверку, потому что Object.prototype.toString.call(null) === '[object Null]' - person Gust van de Wal; 06.11.2019

Вот ответ с необязательной цепочкой и, возможно, самой маленькой isObj функцией для этого вопроса.

const isObj = o => o?.constructor === Object;

// True for this
console.log(isObj({}));        // object!

// False for these
console.log(isObj(0));         // number
console.log(isObj([]));        // array
console.log(isObj('lol'));     // string
console.log(isObj(null));      // null
console.log(isObj(undefined)); // undefined
console.log(isObj(() => {}));  // function
console.log(isObj(Object));    // class

person Jayant Bhawal    schedule 08.05.2020
comment
new Error() будет ложным в вашей функции. - person TinyRoy; 15.05.2020
comment
@TinyRoy - это не так, как должно быть? Экземпляр ошибки не является объектом. Сообщите мне, если я что-то не так понял. :) - person Jayant Bhawal; 16.05.2020
comment
Если вы намерены исключить экземпляры, унаследованные от Object, то вы правы, но я рассматриваю их как объекты. У них есть все свойства объекта. - person TinyRoy; 18.05.2020
comment
Я считаю, что вопрос был задан именно так. В противном случае в основном все наследуется от Object. - person Jayant Bhawal; 18.05.2020
comment
что это '? знак значит? - person Pedro Fernandes Martins; 12.09.2020
comment
@PedroFernandesMartins - это необязательный оператор цепочки. developer.mozilla.org/en-US/docs/ Интернет / JavaScript / Справочник / - person Jayant Bhawal; 14.09.2020
comment
Вау, я всю жизнь ждал этих знаний! спасибо - person Pedro Fernandes Martins; 15.09.2020

var a = [1]
typeof a //"object"
a instanceof Object //true
a instanceof Array //true

var b ={a: 1}
b instanceof Object //true
b instanceof Array //false

var c = null
c instanceof Object //false
c instanceof Array //false

Меня попросили предоставить более подробную информацию. Самый чистый и понятный способ проверить, является ли наша переменная объектом - typeof myVar. Он возвращает строку с типом (например, "object", "undefined").

К сожалению, либо Array, либо null также имеют тип object. Чтобы брать только реальные объекты, необходимо проверить цепочку наследования с помощью оператора instanceof. Это устранит null, но у Array есть Object в цепочке наследования.

Итак, решение:

if (myVar instanceof Object && !(myVar instanceof Array)) {
  // code for objects
}
person Kania    schedule 10.06.2016

lodash имеет isPlainObject, который может быть тем, что ищут многие посетители этой страницы. Он возвращает false при передаче функции или массива.

person Pat    schedule 20.10.2014
comment
Идеально! Я знал о _.isObject, который соответствует тому, что JS считает объектом. Но обычно мне нужно различать, например, литерал объекта и массив, что позволяет мне делать _.isPlainObject. - person lime; 16.12.2014

Когда все остальное терпит неудачу, я использую это:

var isObject = function(item) {
   return item.constructor.name === "Object";
}; 
person Michal    schedule 18.09.2014
comment
Почему сравнение строк, почему не просто item.constructor === Object? - person K3---rnc; 28.02.2016
comment
null выдает исключение Uncaught TypeError: Cannot read property 'constructor' of null(…) - person Vitim.us; 17.05.2016
comment
@rounce Я стремлюсь поддерживать старые версии IE, почему это не работает в IE? Из-за indexOf или из-за constructor.name? - person Jankapunkt; 24.01.2018
comment
Это также не удастся с undefined. - person Emilio Grisolía; 28.10.2020

Это сработает. Это функция, которая возвращает true, false или, возможно, null.

const isObject = obj => obj && obj.constructor && obj.constructor === Object;

console.log(isObject({})); // true
console.log(isObject([])); // false
console.log(isObject(new Function)); // false
console.log(isObject(new Number(123))); // false
console.log(isObject(null)); // null

person pizzarob    schedule 05.04.2017
comment
@SeregPie В дальнейшем вам следует воздерживаться от редактирования кода в ответах. Поскольку этот ответ стоит, при тестировании я действительно получил null в качестве результата финального теста, а не false. См. Когда мне следует вносить изменения в код? - person Nick; 13.12.2017

Функциональная библиотека Ramda имеет замечательную функцию для определения типов JavaScript.

Перефразируя полную функцию:

function type(val) {
  return val === null      ? 'Null'      :
         val === undefined ? 'Undefined' :
         Object.prototype.toString.call(val).slice(8, -1);
}

Пришлось рассмеяться, когда я понял, насколько простым и красивым было решение.

Пример использования из документации Ramda:

R.type({}); //=> "Object"
R.type(1); //=> "Number"
R.type(false); //=> "Boolean"
R.type('s'); //=> "String"
R.type(null); //=> "Null"
R.type([]); //=> "Array"
R.type(/[A-z]/); //=> "RegExp"
R.type(() => {}); //=> "Function"
R.type(undefined); //=> "Undefined"
person DaveGauer    schedule 22.02.2018

Поскольку кажется, что существует большая путаница в том, как правильно решить эту проблему, я оставлю свои 2 цента (этот ответ соответствует спецификации и дает правильные результаты при любых обстоятельствах):

Тестирование примитивов: undefined null boolean string number

function isPrimitive(o){return typeof o!=='object'||null}

Объект не примитив:

function isObject(o){return !isPrimitive(o)}

Или альтернативно:

function isObject(o){return o instanceof Object}
function isPrimitive(o){return !isObject(o)}

Тестирование для любого массива:

const isArray=(function(){
    const arrayTypes=Object.create(null);
    arrayTypes['Array']=true;
    arrayTypes['Int8Array']=true;
    arrayTypes['Uint8Array']=true;
    arrayTypes['Uint8ClampedArray']=true;
    arrayTypes['Int16Array']=true;
    arrayTypes['Uint16Array']=true;
    arrayTypes['Int32Array']=true;
    arrayTypes['Uint32Array']=true;
    arrayTypes['BigInt64Array']=true;
    arrayTypes['BigUint64Array']=true;
    arrayTypes['Float32Array']=true;
    arrayTypes['Float64Array']=true;
    return function(o){
        if (!o) return false;
        return !isPrimitive(o)&&!!arrayTypes[o.constructor.name];
    }
}());

Тестирование на предмет исключая: Date RegExp Boolean Number String Function любой массив

const isObjectStrict=(function(){
    const nativeTypes=Object.create(null);
    nativeTypes['Date']=true;
    nativeTypes['RegExp']=true;
    nativeTypes['Boolean']=true;
    nativeTypes['Number']=true;
    nativeTypes['String']=true;
    nativeTypes['Function']=true;
    return function(o){
        if (!o) return false;
        return !isPrimitive(o)&&!isArray(o)&&!nativeTypes[o.constructor.name];
    }
}());
person c7x43t    schedule 12.11.2018

Прочитав и опробовав множество реализаций, я заметил, что очень немногие люди пытаются проверять такие значения, как JSON, Math, document или объекты с цепочками прототипов длиннее 1 шага.

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

В конце концов, оператор typeof сообщит вам, является ли что-то объектом JavaScript, но определение объекта в JavaScript слишком широко для большинства реальных сценариев (например, typeof null === 'object'). Ниже приведена функция, которая определяет, является ли переменная v объектом, путем повторения двух проверок:

  1. Запускается цикл, который продолжается до тех пор, пока строковая версия v равна '[object Object]'.
    Я хотел, чтобы результат функции был точно таким же, как в журналах ниже, так что это единственный критерий "объектности", с которым я столкнулся. . В случае неудачи функция сразу же возвращает false.
  2. v заменяется следующим прототипом в цепочке с v = Object.getPrototypeOf(v), но также оценивается непосредственно после него. Когда новое значение v равно null, это означает, что каждый прототип, включая корневой прототип (который вполне мог быть единственным прототипом внутри цепочки) прошел проверку. в цикле while, и мы можем вернуть true. В противном случае начинается новая итерация.

function isObj (v) {
  while (     Object.prototype.toString.call(v) === '[object Object]')
  if    ((v = Object.getPrototypeOf(v))         === null)
  return true
  return false
}

console.log('FALSE:')
console.log('[]                   -> ', isObj([]))
console.log('null                 -> ', isObj(null))
console.log('document             -> ', isObj(document))
console.log('JSON                 -> ', isObj(JSON))
console.log('function             -> ', isObj(function () {}))
console.log('new Date()           -> ', isObj(new Date()))
console.log('RegExp               -> ', isObj(/./))

console.log('TRUE:')
console.log('{}                   -> ', isObj({}))
console.log('new Object()         -> ', isObj(new Object()))
console.log('new Object(null)     -> ', isObj(new Object(null)))
console.log('new Object({})       -> ', isObj(new Object({foo: 'bar'})))
console.log('Object.prototype     -> ', isObj(Object.prototype))
console.log('Object.create(null)  -> ', isObj(Object.create(null)))
console.log('Object.create({})    -> ', isObj(Object.create({foo: 'bar'})))
console.log('deep inheritance     -> ', isObj(Object.create(Object.create({foo: 'bar'}))))

person Gust van de Wal    schedule 10.09.2019

Для моего кода я обнаружил это решение, которое соответствует некоторым из приведенных выше ответов:

Вариант ES6:

const checkType = o => Object.prototype
                    .toString
                    .call(o)
                    .replace(/\[|object\s|\]/g, '')
                    .toLowerCase();

Вариант ES5:

function checkType(o){
   return Object.prototype
                    .toString
                    .call(o)
                    .replace(/\[|object\s|\]/g, '')
                    .toLowerCase();
}

Вы можете использовать это очень просто:

checkType([]) === 'array'; // true
checkType({}) === 'object'; // true
checkType(1) === 'number'; // true
checkType('') === 'string'; // true
checkType({}.p) === 'undefined'; // true
checkType(null) === 'null'; // true

и так далее..

person Christiyan    schedule 23.06.2020

const isObject = function(obj) {
  const type = typeof obj;
  return type === 'function' || type === 'object' && !!obj;
};

!!obj - это сокращение для проверки правдивости obj (чтобы отфильтровать null)

person Ira    schedule 16.12.2014

Это старый вопрос, но я решил оставить его здесь. Большинство людей проверяют, является ли переменная {}, что означает пару "ключ-значение", а не то, что является подчеркиванием конструкции, которую JavaScript использует для данной вещи, потому что, честно говоря, в JavaScript в основном все является объектом. Так что убираем это с дороги. Если да ...

let x = function() {}
typeof x === 'function' //true
x === Object(x) // true
x = []
x === Object(x) // true

// also
x = null
typeof null // 'object'

В большинстве случаев нам нужно знать, есть ли у нас объект ресурса из API или вызов нашей базы данных, возвращенный из ORM. Затем мы можем проверить, не является ли он Array, не null, не является ли он типом 'function' и является ли Object

// To account also for new Date() as @toddmo pointed out

x instanceof Object && x.constructor === Object

x = 'test' // false
x = 3 // false
x = 45.6 // false
x = undefiend // false
x = 'undefiend' // false
x = null // false
x = function(){} // false
x = [1, 2] // false
x = new Date() // false
x = {} // true
person Gilbert    schedule 27.11.2019
comment
всплывает true для new Date() - person toddmo; 01.01.2020
comment
@toddmo, спасибо, что указали на это. Теперь пример кода возвращает false для new Date() - person Gilbert; 02.01.2020

Представление

Сегодня, 2020.09.26, я провожу тесты на MacOs HighSierra 10.13.6 на Chrome v85, Safari v13.1.2 и Firefox v80 для выбранных решений.

Полученные результаты

  • решения C и H быстрые / самые быстрые во всех браузерах для всех случаев
  • решения D и G медленные / самые медленные во всех браузерах во всех случаях

введите описание изображения здесь

Подробности

Я выполняю 3 тестовых примера для решений A B C D E F G H I J K L M N O P Q R S T U V

  • для небольшого объекта - вы можете запустить его ЗДЕСЬ
  • для большого объекта - вы можете запустить его ЗДЕСЬ
  • без объекта - вы можете запустить его ЗДЕСЬ

Во фрагменте ниже представлены различия между решениями. Решения A – G дают правильные ответы для выбранных случаев, описанных Мэттом Фенвиком

// https://stackoverflow.com/a/14706877/860099
function A(x) {
  return x === Object(x);
};

// https://stackoverflow.com/a/42250981/860099
function B(x) {
    return _.isObject(x);
}

// https://stackoverflow.com/a/34864175/860099
function C(x) {
    return x != null && (typeof x === 'object' || typeof x === 'function');
}

// https://stackoverflow.com/a/39187058/860099
function D(x) { 
  return new function() { return x; }() === x;
}

// https://stackoverflow.com/a/39187058/860099
function E(x) { 
  return function() { return this === x; }.call(x);
}

// https://stackoverflow.com/a/39187058/860099
function F(x) { /* Requires ECMAScript 5 or later */
  try {
    Object.create(x);
    return x !== null;
  } catch(err) {
    return false;
  }
}

// https://stackoverflow.com/a/39187058/860099
function G(x) { /* Requires ECMAScript 5 or later */
  function Constructor() {}
  Constructor.prototype = x;
  return Object.getPrototypeOf(new Constructor()) === x;
}

// https://stackoverflow.com/a/8511332/860099
function H(x) {
  return typeof x === 'object' && x !== null
}

// https://stackoverflow.com/a/25715455/860099
function I(x) {
  return (typeof x === "object" && !Array.isArray(x) && x !== null);
};

// https://stackoverflow.com/a/22482737/860099
function J(x) {
  return x instanceof Object; 
}

// https://stackoverflow.com/a/50712057/860099
function K(x)
{
    let t= JSON.stringify(x);
    return t ? t[0] === '{' : false;
}

// https://stackoverflow.com/a/13356338/860099
function L(x) {
  return Object.prototype.toString.call(x) === "[object Object]";
};



// https://stackoverflow.com/a/46663081/860099
function M(o, strict = true) {
  if (o === null || o === undefined) {
    return false;
  }
  const instanceOfObject = o instanceof Object;
  const typeOfObject = typeof o === 'object';
  const constructorUndefined = o.constructor === undefined;
  const constructorObject = o.constructor === Object;
  const typeOfConstructorObject = typeof o.constructor === 'function';
  let r;
  if (strict === true) {
    r = (instanceOfObject || typeOfObject) && (constructorUndefined || constructorObject);
  } else {
    r = (constructorUndefined || typeOfConstructorObject);
  }
  return r;
}

// https://stackoverflow.com/a/42250981/860099
function N(x) {
    return $.type(x) === 'object';
}

// https://stackoverflow.com/a/34864175/860099
function O(x) {
    if (Object.prototype.toString.call(x) !== '[object Object]') {
        return false;
    } else {
        var prototype = Object.getPrototypeOf(x);
        return prototype === null || prototype === Object.prototype;
    }
}

// https://stackoverflow.com/a/57863169/860099
function P(x) {
  while (     Object.prototype.toString.call(x) === '[object Object]')
  if    ((x = Object.getPrototypeOf(x))         === null)
  return true
  return false
}

// https://stackoverflow.com/a/43289971/860099
function Q(x){
  try{
    switch(x.constructor){
      case Number:
      case Function:
      case Boolean:
      case Symbol:
      case Date:
      case String:
      case RegExp:
        return x.constructor === Object;
      case Error:
      case EvalError:
      case RangeError:
      case ReferenceError:
      case SyntaxError:
      case TypeError:
      case URIError:
        return (Object === Error ? Error : x.constructor) === Object;
      case Array:
      case Int8Array:
      case Uint8Array:
      case Uint8ClampedArray:
      case Int16Array:
      case Uint16Array:
      case Int32Array:
      case Uint32Array:
      case Float32Array:
      case Float64Array:
        return (Object === Array ? Array : x.constructor) === Object;
      case Object:
      default:
        return (Object === Object ? Object : x.constructor) === Object;
    }
  } catch(ex){
    return x == Object;   
  }
}

// https://stackoverflow.com/a/52478680/860099
function R(x) {
    return typeof x == 'object' && x instanceof Object && !(x instanceof Array);
}

// https://stackoverflow.com/a/51458052/860099
function S(x)
{
    return x != null && x.constructor?.name === "Object"
}

// https://stackoverflow.com/a/42250981/860099
function T(x) {
    return x?.constructor?.toString().indexOf("Object") > -1;
}

// https://stackoverflow.com/a/43223661/860099
function U(x)
{
    return x?.constructor === Object;
}

// https://stackoverflow.com/a/46663081/860099
function V(x) {
  return x instanceof Object && x.constructor === Object;
}




// -------------
// TEST
// -------------

console.log('column: 1 2 3 4 5 6 - 7 8 9 10 11');

[A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V]
.map(f=> console.log(`${f.name}:      ${1*f(new Date())} ${1*f(/./)} ${1*f({})} ${1*f(Object.prototype)} ${1*f(Object.create(null))} ${1*f(()=>{})} - ${1*f("abc")} ${1*f(3)} ${1*f(true)}  ${1*f(null)}  ${1*f(undefined)}`))

console.log(`
Columns legend (test cases):
 1: new Date()
 2: /./ (RegExp)
 3: {}
 4: Object.prototype
 5: Object.create(null)
 6: ()=>{} (function)
 7: "abc" (string)
 8: 3 (number)
 9: true (boolean)
10: null
11: undefined

Rows:
1 = is object
0 = is NOT object

Theoretically columns 1-6 should have have 1, columns 7-11 shoud have 0
`);
<script
  src="https://code.jquery.com/jquery-3.5.1.min.js"
  integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
  crossorigin="anonymous"></script>
  
<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" 
  integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" 
  crossorigin="anonymous"></script>
  
This shippet only presents functions used in performance tests - it not perform tests itself!

А вот примеры результатов для хрома

введите описание изображения здесь

person Kamil Kiełczewski    schedule 25.09.2020

Если вы явно хотите проверить, является ли данное значение {}.

function isObject (value) {
 return value && typeof value === 'object' && value.constructor === Object;
}
person Carlos    schedule 28.08.2019

function isObjectLike(value) {
  return value != null && typeof value == 'object' && !Array.isArray(value);
}

На основе lodash

person insign    schedule 12.04.2020
comment
Это решение вернет true для массивов, как указано ниже @Exception. Добавление && !Array.isArray(value) в оператор return устранило бы это - person Matti; 28.08.2020

я нашел «новый» способ сделать именно такую ​​проверку типов из этого вопроса SO: Почему instanceof возвращает false для некоторых литералов?

из этого я создал функцию для проверки типов следующим образом:

function isVarTypeOf(_var, _type){
    try {
        return _var.constructor === _type;
    } catch(ex) {
        return false;         //fallback for null or undefined
    }
}

тогда вы можете просто сделать:

console.log(isVarTypeOf('asdf', String));   // returns true
console.log(isVarTypeOf(new String('asdf'), String));   // returns true
console.log(isVarTypeOf(123, String));   // returns false
console.log(isVarTypeOf(123, Number));   // returns true
console.log(isVarTypeOf(new Date(), String));   // returns false
console.log(isVarTypeOf(new Date(), Number));   // returns false
console.log(isVarTypeOf(new Date(), Date));   // returns true
console.log(isVarTypeOf([], Object));   // returns false
console.log(isVarTypeOf([], Array));   // returns true
console.log(isVarTypeOf({}, Object));   // returns true
console.log(isVarTypeOf({}, Array));   // returns false
console.log(isVarTypeOf(null, Object));   // returns false
console.log(isVarTypeOf(undefined, Object));   // returns false
console.log(isVarTypeOf(false, Boolean));   // returns true

это проверено на Chrome 56, Firefox 52, Microsoft Edge 38, Internet Explorer 11, Opera 43

edit:
если вы также хотите проверить, является ли переменная нулевой или неопределенной, вы можете использовать это вместо этого:

function isVarTypeOf(_var, _type){
    try {
        return _var.constructor === _type;
    } catch(ex) {
        return _var == _type;   //null and undefined are considered the same
        // or you can use === if you want to differentiate them
    }
}

var a = undefined, b = null;
console.log(isVarTypeOf(a, undefined)) // returns true
console.log(isVarTypeOf(b, undefined)) // returns true
console.log(isVarTypeOf(a, null)) // returns true

обновление из комментария inanc: вызов принят: D

если вы хотите потерять сравниваемые объекты, вы можете попробовать это:

function isVarTypeOf(_var, _type, looseCompare){
    if (!looseCompare){
        try {
            return _var.constructor === _type;
        } catch(ex){
            return _var == _type;
        }
    } else {
        try{
            switch(_var.constructor){
                case Number:
                case Function:
                case Boolean:
                case Symbol:
                case Date:
                case String:
                case RegExp:
                    // add all standard objects you want to differentiate here
                    return _var.constructor === _type;
                case Error:
                case EvalError:
                case RangeError:
                case ReferenceError:
                case SyntaxError:
                case TypeError:
                case URIError:
                    // all errors are considered the same when compared to generic Error
                    return (_type === Error ? Error : _var.constructor) === _type;
                case Array:
                case Int8Array:
                case Uint8Array:
                case Uint8ClampedArray:
                case Int16Array:
                case Uint16Array:
                case Int32Array:
                case Uint32Array:
                case Float32Array:
                case Float64Array:
                    // all types of array are considered the same when compared to generic Array
                    return (_type === Array ? Array : _var.constructor) === _type;
                case Object:
                default:
                    // the remaining are considered as custom class/object, so treat it as object when compared to generic Object
                    return (_type === Object ? Object : _var.constructor) === _type;
            }
        } catch(ex){
            return _var == _type;   //null and undefined are considered the same
            // or you can use === if you want to differentiate them
        }
    }
}

Таким образом, вы можете сделать то же, что и комментарий inanc:

isVarTypeOf(new (function Foo(){}), Object); // returns false
isVarTypeOf(new (function Foo(){}), Object, true); // returns true

or

Foo = function(){};
Bar = function(){};
isVarTypeOf(new Foo(), Object);   // returns false
isVarTypeOf(new Foo(), Object, true);   // returns true
isVarTypeOf(new Bar(), Foo, true);   // returns false
isVarTypeOf(new Bar(), Bar, true);   // returns true
isVarTypeOf(new Bar(), Bar);    // returns true
person am05mhz    schedule 08.04.2017
comment
Это не может определить, является ли новый класс объектом. isVarTypeOf (new (function Foo () {}), Object) // Это возвращает false вместо true. См. Мой ответ ниже для правильной проверки. - person Inanc Gumus; 10.05.2017
comment
Однако вы можете использовать instanceof для проверки объектов. Тем не менее, это не точная наука. - person Inanc Gumus; 10.05.2017
comment
@inanc, это потому, что new Foo() возвращает объект Foo, так же, как new String() возвращает объект String, или new Date() возвращает объект Date, вы также можете сделать Foo = function(){}; isVarTypeOf(new Foo(), Foo); - person am05mhz; 12.05.2017
comment
Да, на самом деле я так и говорю: сейчас вы не проверяете, является ли это объектом. - person Inanc Gumus; 12.05.2017
comment
@inanc Ура, я искал способ выполнить проверку типов (а не только объект), добрался до этой страницы и другой страницы, потом я был слишком взволнован, что забыл контекст этого вопроса, мое плохое :) - person am05mhz; 12.05.2017

Что мне нравится использовать, так это

function isObject (obj) {
  return typeof(obj) == "object" 
        && !Array.isArray(obj) 
        && obj != null 
        && obj != ""
        && !(obj instanceof String)  }

Я думаю, что в большинстве случаев дата должна пройти проверку как объект, поэтому я не отфильтровываю даты

person JohnPan    schedule 24.04.2017

вы можете просто использовать JSON.stringify для тестирования своего объекта, например:

var test = {}
if(JSON.stringify(test)[0] === '{') {
  console.log('this is a Object')
}

person GuaHsu    schedule 06.06.2018
comment
Может также потребоваться обработать undefined. JSON.stringify(undefined) вызовет исключение. Мы используем это: function isObject(o) { try { return JSON.stringify(o)[0] === '{' } catch(ex) { return false } } Однако мы не измеряли производительность. - person storsoc; 20.03.2020
comment
Это не работает для массивов и для каждого объекта с пользовательским методом toJSON, например Dates или объекта { toJSON(){ return 1; } }. - person Sebastian Simon; 14.05.2020
comment
+1 для творчества - это довольно красивая и экзотическая альтернатива для других ответов - эта версия обрабатывает больше случаев: function isObject(x) {let t= JSON.stringify(x); return t ? t[0] === '{' : false;} - person Kamil Kiełczewski; 24.09.2020

Если вы уже используете AngularJS, у него есть встроенный метод, который проверяет, является ли он объектом (без принятия null).

angular.isObject(...)
person Robert    schedule 20.05.2015
comment
Некоторое время использовал это в AngularJS, пока нас не удивило: angular.isObject (new Date ()) // true - person storsoc; 20.03.2020

Подумайте - typeof bar === "object", чтобы определить, является ли bar объектом

Хотя typeof bar === "object" - это надежный способ проверить, является ли bar объектом, удивительная ошибка в JavaScript заключается в том, что null также считается объектом!

Следовательно, следующий код, к удивлению большинства разработчиков, выводит в консоль «истину» (а не ложь):

var bar = null; console.log(typeof bar === "object"); // logs true! Пока кто-то знает об этом, проблемы можно легко избежать, также проверив, является ли bar нулевым:

console.log((bar !== null) && (typeof bar === "object")); // logs false Чтобы дать полный ответ, стоит отметить еще две вещи:

Во-первых, приведенное выше решение вернет false, если bar является функцией. В большинстве случаев это желаемое поведение, но в ситуациях, когда вы хотите также вернуть true для функций, вы можете изменить приведенное выше решение следующим образом:

console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function"))); Во-вторых, приведенное выше решение вернет истину, если bar является массивом (например, если var bar = [];). В большинстве случаев это желаемое поведение, поскольку массивы действительно являются объектами, но в ситуациях, когда вы хотите также установить false для массивов, вы можете изменить приведенное выше решение следующим образом:

console.log((bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]")); Однако есть еще одна альтернатива, которая возвращает false для значений NULL, массивов и функций, но истинно для объектов:

console.log((bar !== null) && (bar.constructor === Object)); Или, если вы используете jQuery:

console.log((bar !== null) && (typeof bar === "object") && (! $.isArray(bar)));

ES5 делает случай массива довольно простым, включая собственную проверку на null:

console.log(Array.isArray(bar));

person Exception    schedule 09.07.2018

Самый простой способ определить, является ли переменная Объектом или нет:

сначала: оцените тип объекта

второй: получение свойства массива из объекта должно возвращать undefined (например, length - это свойство массива, которое не работает с объектом)

so:

if (_object instanceof Object && _object.length === undefined) {
// here you can be sure that you have a curly bracket object :)
}
person p.daniel    schedule 03.12.2020

В основном используется typeof obj[index] === 'object', но он также возвращает function и #document, которые являются объектами. Это зависит от вас, нужно ли включать это в результат.

По сути, вы можете выполнить тестовый код, который отфильтровывает, является ли конкретный элемент объектом, проверяя вывод в консоли. Здесь вы можете запустить код только для примера:

function cekObject(obj, index) {  
  if (!obj.tagName) {

    //test case #1      
    if (typeof obj === 'object') {
      console.log('obj['+ index +'] is listed as an object');
    }	
    
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<script>
  function updateFilters() {
    var object = $('.j-image');
    $('.juicer-feed').empty();
    
    for(var index in object) {
      cekObject(object[index], index);
    }; 
  }
</script>

<ul class="juicer-feed" data-feed-id="chetabahana" data-after="updateFilters()"></ul>
<script src="https://assets.juicer.io/embed.js"></script>

person Chetabahana    schedule 23.05.2018

Это зависит от варианта использования, если мы не хотим, чтобы массив и функции были объектами, мы можем использовать встроенные функции underscore.js.

    function xyz (obj) { 
       if (_.isObject(obj) && !_.isFunction(obj) && !_.isArray(obj)) {
         // now its sure that obj is an object 
       } 
    }
person ajayv    schedule 12.11.2017

Это сложно, потому что массив является типом объекта, функция - типом объекта, а фактический объект {} также является типом объекта.

Проблема

const arr = []
const fun = function(){}
const actualObj = {}

arr instanceof Object // true
fun instanceof Object // true
actualObj instanceof Object // true

Итак, цель актуальна: Obj должен возвращать истину, а все остальное - ложь.

actualObj instanceof Object && !(actualObj instanceof Array) && !(typeof actualObj === 'function') // true
person Sandeep Amarnath    schedule 02.05.2021

Использование typeof(my_obj) сообщит, какой это тип переменной.

для массива: Array.isArray(inp) или [] isinstanceof Array

если это объект, покажет "объект"

простая функция JS

function isObj(v) {
    return typeof(v) == "object"
}

Например:

function isObj(v) {
    return typeof(v) == "object"
}

var samp_obj = {
   "a" : 1,
   "b" : 2,
   "c" : 3
}

var num = 10;
var txt = "Hello World!"
var_collection = [samp_obj, num, txt]
for (var i in var_collection) {
  if(isObj(var_collection[i])) {
     console.log("yes it is object")
  }
  else {
     console.log("No it is "+ typeof(var_collection[i]))
  }
}

person Mohideen bin Mohammed    schedule 19.07.2017
comment
А как насчет массивов? - person Bernardo Dal Corno; 25.04.2019
comment
Переменная, запрошенная OP, является объектом .. если вы хотите проверить, является ли массив, попробуйте Array.isArray (inp) или [] isinstanceof Array - person Mohideen bin Mohammed; 26.04.2019
comment
Это явно не для null. - person Sebastian Simon; 14.05.2020
comment
typeof (как и instanceof) на самом деле является оператором operator, поэтому скобки не требуются. Правильный синтаксис - typeof x, поскольку это оператор типа. Точно так же, как вы сделали бы instanceof x, а не instanceof (x). Однако код в ответе работает. - person Netside; 13.07.2020

Помните, ребята, что typeof new Date() это "object".

Поэтому, если вы ищете { key: value } объектов, объект даты недействителен.

Наконец, на мой взгляд, o => o && typeof o === 'object' && !(o instanceof Date) - лучший ответ на ваш вопрос.

person Nidhal Ben Tahar    schedule 03.10.2020

Небольшой консольный эксперимент NodeJS, основанный на прочтении третьего варианта Мэтта Фенвика к его полному ответу выше. Просто небольшая настройка, чтобы получить true или false.

Следующее возвращает false для объекта test.

> if(Object.getPrototypeOf('v') === Object.prototype){console.log(true);}else{console.log(false);}
false
undefined
> if(Object.getPrototypeOf(1) === Object.prototype){console.log(true);}else{console.log(false);}
false
undefined
> if(Object.getPrototypeOf(false) === Object.prototype){console.log(true);}else{console.log(false);}
false
undefined
> if(Object.getPrototypeOf(['apple']) === Object.prototype){console.log(true);}else{console.log(false);}
false
undefined

Объект вернет истину.

> if(Object.getPrototypeOf({'this':10}) === Object.prototype){console.log(true);}else{console.log(false);}
true
undefined
person bobZBy    schedule 22.09.2016

прямой ответ, конечно, typeof v==='object', но это ужасно бесполезно. Интересно, имел ли OP в виду простой словарь ..

пытаться:

isdict(v) { return  v !== undefined && v!==null && typeof v==='object' && v.constructor!==Array && v.constructor!==Date; }
person kofifus    schedule 06.09.2016
comment
Не работает для регулярных выражений, объектов пространства имен, таких как Math и JSON, функций и т. Д. - person Jared Smith; 03.02.2017

Это легко сделать с помощью метода toString () класса Object.prototype.

if(Object.prototype.toString.call(variable) == "[object Object]"){
   doSomething();
}

or

if(Object.prototype.toString.call(variable).slice(8,-1).toLowerCase() == "object"){
   doSomething();
}
person Emil    schedule 12.07.2016
comment
Вы хотели написать slice(1, 7) вместо slice(8,1)? Возможно, вы захотите немного подробнее рассказать о различиях этих двух методов, например. грамм. последний также принимает null, Number, Array, а первый принимает только «чистые» объекты (например, он не принимает new Number(), даже если он тоже возвращает объект). - person le_m; 13.07.2016
comment
я имел в виду срез (8, -1). была опечатка. - person Emil; 13.07.2016
comment
Ложноотрицательные: функции - person Philipp Claßen; 03.09.2016

У меня есть работающий фрагмент кода. Меня сбивает с толку, когда не приводится весь фрагмент кода, поэтому я просто создал его сам:

    <!DOCTYPE html>
    <html>
    <body>
    <button onclick="myFunc()">Try it</button>

    <script>
    var abc = new Number();
    // var abc = 4;
    //this is a code variation which will give a diff alert

    function myFunc()
    {
    if(abc && typeof abc === "object")
    alert('abc is an object and does not return null value');
    else
    alert('abc is not an object');
    }
    </script>

    </body>
    </html>
person youGuysRock    schedule 30.09.2013
comment
Ложноотрицательные: функции. - person Matt Fenwick; 18.03.2014

person    schedule
comment
И, конечно же, это будет false для объекта Object.assign({}, {constructor: null}). - person Sebastian Simon; 14.05.2020

person    schedule
comment
Это не отвечает на вопрос о том, как определить, является ли значение объектом, а не равны ли два объекта. - person Jared Smith; 11.11.2020