Как проверить, является ли значение объектом в JavaScript?
Проверьте, является ли значение объектом в JavaScript
Ответы (48)
ОБНОВЛЕНИЕ:
Этот ответ является неполным и дает вводящие в заблуждение результаты. Например, null
также считается типом object
в JavaScript, не говоря уже о некоторых других крайних случаях. Следуйте приведенной ниже рекомендации и переходите к другому наиболее положительному (и правильному!) Ответу:
typeof yourVariable === 'object' && yourVariable !== null
Исходный ответ:
Попробуйте использовать typeof(var)
и / или var instanceof something
.
РЕДАКТИРОВАТЬ: этот ответ дает представление о том, как исследовать свойства переменной, но это не надежный рецепт (в конце концов, рецепта вообще нет!) Для проверки того, является ли это объектом, далеко не так. Поскольку люди склонны искать что-то, что можно скопировать отсюда, не проводя никаких исследований, я настоятельно рекомендую им обратиться к другому, наиболее положительному (и правильному!) Ответу.
myvar instanceof(something)
или (myvar)instanceof(something)
? ;)
- person RightSaidFred; 15.12.2011
typeof x
с скобками выглядит как функция, но instanceof
нет, что бы вы ни делали. Понятия не имею, почему typeof
не является функцией (я не знаю достаточно JS, чтобы решить, может ли это быть).
- person maaartinus; 06.04.2014
function fntypeof(x){return typeof x}
. Более того, у вас может быть function fninstanceof(x,y){return x instanceof y}
. Причина, по которой это оператор, вероятно, состоит в том, что он смоделирован после c sizeof
, которое происходит во время компиляции. И основная причина использовать обширные круглые скобки в коде для меня заключается в том, что я не всегда помню приоритеты;)
- person Michael Krelin - hacker; 06.04.2014
typeof
возвращает "объект" для null, который не является объектом, и instanceof
не работает для объектов, созданных с использованием Object.create(null)
.
- person Nikolai; 09.04.2014
someArray instanceof Object //true
или typeof someArray === 'object' // true
. А как насчет: Object.prototype.toString.call(someObject) === "[object Object]"
или "[object Array]"
, если вы пытаетесь обнаружить массив?
- person Con Antonakos; 19.06.2015
(typeof something)==='object'
вместо typeof(something)==='object'
.
- person maurice; 20.07.2016
Array instanceof Object
- person ; 01.09.2017
typeof null == "object"
.
- person doubleOrt; 28.12.2017
blabla
и / или blabla
что-нибудь. РЕДАКТИРОВАТЬ: этот ответ дает представление blabla ...
- person ; 27.06.2019
typeof(foo)
сбивает людей с толку? Иногда я использую его просто потому, что, как мне кажется, вопрос о том, является ли typeof
оператором или функцией, в большинстве случаев не имеет значения, и я не хочу тратить свое время на его поиск, чтобы напомнить себе. Я не думаю, что будет справедливо говорить, что я сбит с толку; Я просто делаю вещи простыми, когда они не должны быть сложными.
- person Don Hatch; 26.12.2019
Date()
будет обнаружен с этим.
- person Dimitri Kopriwa; 07.05.2021
Если typeof yourVariable === 'object'
, это объект или ноль. Если вы хотите исключить null и массив, просто сделайте это typeof yourVariable === 'object' && yourVariable !== null && !Array.isArray(yourVariable)
.
typeof
утверждает иное. Не уверен насчет формулировки в ES3. Это исправлено в ES6. В любом случае null
не ведет себя как объект. Ваш yourVariable != null
- это общий подход, поэтому +1.
- person RightSaidFred; 15.12.2011
yourVariable !== null
было бы лучше?
- person hippietrail; 23.05.2013
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
typeof [1,2]
равно object
?
- person Lewis; 03.08.2014
typeof
, потому что в нем есть несколько особых случаев, которые не обязательно имеют большой смысл. Если вы пытаетесь различать массивы и объекты, которые не являются массивами, то вам определенно не нужно использовать typeof
.
- person Matt Fenwick; 01.12.2014
yourVariable && typeof yourVariable === 'object
, чем явно проверять null
? Что, если yourVariable
равно undefined
?
- person James; 28.10.2015
Object.prototype.toString.call(yourVar)
, будучи yourVar тем, что вам нужно проверить. В случае массивов Object.prototype.toString.call([1,2])
возвращает [object Array]
- person Jose Rui Santos; 25.02.2016
yourVariable !== null && typeof yourVariable === 'object' && !Array.isArray( yourVariable )
Тип массивов оценивается как "object"
. Добавлена проверка массивов
- person X_Trust; 13.10.2016
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
Array.isArray(yourVariable)
.
- person Alexander Flenniken; 30.11.2017
typeof []
возвращает "object"
, массивы будут включены в проверку по умолчанию.
- person doubleOrt; 28.12.2017
null
- ложными. Это означает, что вторая версия также может быть записана как typeof yourVariable === 'object' && yourVariable
- person 3limin4t0r; 04.06.2019
true
подойдет. Можно сказать, что функции также являются объектами и должны быть включены. Но у программиста должна быть свобода быть конкретным и исключать возможные функции! Или уметь сортировать объекты по функциям! Или иметь аргумент, который может быть function(){}
закрытием или объектом {}
.
- person ; 27.06.2019
&& yourVariable !== null
. И также следует отметить общепринятый ответ, потому что махание рукой - это вообще не ансер. Прочтите еще раз и проснитесь: Попробуйте использовать typeof(var)
и / или var instanceof something
. РЕДАКТИРОВАТЬ: этот ответ дает идею ... Иногда ответ не получен, потому что никто не ответил.
- person ; 27.06.2019
typeof 'object'
: Buffer
, RegExp
, Date
- person GLAND_PROPRE; 04.12.2019
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 notC
s prototypenew 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({})
typeof
объектом или функцией, может не работать с объектами хоста, которым разрешено возвращать другие вещи, например в объектах IE ActiveX, используемых для возврата unknown.
- person Oriol; 16.06.2015
obj === Object(obj)
возвращает true
для массивов.
- person Onur Yıldırım; 15.02.2016
function isObject(val) { if (val === null) ...
). Я правильно понимаю?
- person Illuminator; 09.04.2016
new Number(3)
- это объект, а не примитив, поэтому его не должно быть в списке примеров ложных срабатываний.
- person Macil; 10.06.2016
getPrototypeOf
не работает, например с отозванными прокси, которые являются объектами, но бросают.
- person Oriol; 28.08.2016
let b = a
или передаю a
в качестве аргумента в вызове функции foo(a)
, могу ли я изменить a
с помощью новой привязки b
или изнутри функции foo
? В этом свете становится ясно, почему функции, объекты и массивы являются объектами, тогда как строки, числа, null, undefined, NaN являются примитивами. Просто мой 2с.
- person Marcus Junius Brutus; 12.12.2016
({}).toString.apply(obj) === '[object Object]'
это различать массивы и объекты, которые не являются массивами
- person MauricioJuanes; 07.11.2018
val instanceof Object
возвращает истину для массивов.
- person Илья Зеленько; 24.12.2018
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;
};
return obj === Object(obj) && Object.prototype.toString.call(obj) !== '[object Array]'
- person Daan; 12.07.2013
Object
преобразуется в объект, а ===
гарантирует, что obj
является тем же объектом.
- person Oriol; 16.06.2015
null
тоже. Должен быть принятый ответ.
- person tiffon; 17.11.2015
_.isPlainObject()
.
- person samvv; 23.06.2016
in
не вызовет ошибки.
- person Domino; 03.11.2018
_.isObject(x) && typeof x !== 'function'
, чтобы проверить, является ли x объектом и ничем другим: P
- person ; 26.06.2019
Object.prototype.toString.call(myVar)
вернет:
"[object Object]"
если myVar - объект"[object Array]"
если myVar - это массив- и т.п.
Для получения дополнительной информации об этом и о том, почему это хорошая альтернатива typeof, прочтите эту статью.
typeof [] === 'object'
- ›true
. Вот для чего нужен этот метод.
- person Jondlm; 11.08.2013
Object.prototype.toString.call(3)
- ›"[object Number]"
. Object.prototype.toString.call(new Number(3))
- ›"[object Number]
- person Matt Fenwick; 18.03.2014
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
isObject
работает только с объектными литералами. Если я создаю настраиваемый тип, создаю экземпляр типа и тестирую его, он возвращает false
- person WickyNilliams; 02.12.2013
new Date
был призван подчеркнуть это. Добавлен акцент в виде примечания, спасибо
- person zupa; 02.12.2013
!!a
- это приведение логического типа в JS. !a
отрицает a
, !!a
двойное отрицание.
- person zupa; 27.04.2015
(!!a)
- оператор !
является логическим отрицанием. поэтому в псевдокоде это not(not(a))
, поэтому, если a
относится к false
(любому из null
, false
, 0
, ""
), то результатом будет false
. это a
не имеет отношения к false
, тогда результат будет true
.
- person Jesse Chisholm; 08.05.2015
Boolean(a)
длиннее, но гораздо интуитивно понятнее. Только не используйте new Boolean(a)
: (вот почему)!
- person Jeroen Versteeg; 20.08.2015
{
. В случае с массивом, если вам не нужна поддержка IE ‹9, вы можете использовать Array.isArray()
, чтобы определить, является ли что-то массивом. Он проходит все предоставленные вами тестовые примеры.
- person Kip; 10.03.2016
class Foo { }; var x = new Foo(); x.someProperty = 1; JSON.stringify({test: x}) // returns '{"test":{"someProperty":1}}'
. Это проверяет, равен ли конструктор Object
(что определенно не верно для всех объектов). Но это не критерий кодирования фигурных скобок JSON.
- person Yetanotherjosh; 13.01.2018
return a && (a.constructor === Object);
тоже работает. Я не вижу необходимости в двойном отрицании
- person Brad Kent; 03.07.2019
!!a
isObject(null)
вернет null
вместо false
- person AKG; 14.08.2019
Object.create(null)
? (ОШИБКА)
- person Do Async; 14.04.2020
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
&& !(item instance of Date)
или, возможно, && Object.prototype.toString.call(item) !== '[object Date]'
, если границы кадра вызывают беспокойство. Хм ...
- person 2540625; 29.06.2015
new Date()
возвращает объект. С логической точки зрения массив не является объектом, хотя JavaScript обрабатывает их и сообщает о них как таковые. Однако на практике видеть их равными бесполезно, потому что это не так. Например, объект не имеет атрибута length
и таких методов, как push (). И иногда вам может потребоваться указать перегруженные параметры функции, где вам нужно различать массив или объект, особенно если другие параметры зависят от того, какой из них был задан.
- person StanE; 06.08.2016
length
, а такие методы, как push
, Object.create(Array.prototype)
- тривиальный контрпример объекта, не являющегося массивом, у которого они есть. Особенность массивов заключается в том, что они являются экзотическими объектами с настраиваемым внутренним методом [[DefineOwnProperty]], но они по-прежнему являются объектами.
- person Oriol; 28.08.2016
length
(я имел в виду, что литералы объектов по умолчанию не имеют атрибута length
). Я писал, что массивы не являются объектами с логической точки зрения. Я говорю о программной логике. Иногда необходимо проверить, является ли массив реальным массивом, а не реальным объектом. Для этого Array.isArray()
. Представьте, что у вас есть функция, которая принимает объект или массив объектов. Проверка на специальный атрибут или метод - грязное решение. Родной способ всегда лучше.
- person StanE; 30.08.2016
Object.create(Array.prototype)
) может быть не лучшим, поскольку он instanceof Array
и такие методы, как .push
, будут работать, как будто это массив.
- person Camilo Martin; 07.09.2016
instanceof
проверяет только наследование, но не поведение. А методы массива, такие как push
, намеренно универсальны, они не требуют объектов массива.
- person Oriol; 07.09.2016
&& item !== null
не имеет смысла, поскольку, если элемент равен null
, тогда typeof item
будет равно "undefined"
, поэтому typeof item === "object"
все равно вернет false.
- person Daniel Tonon; 01.10.2016
typeof null
- это "object"
, а не "undefined"
.
- person 2540625; 02.10.2016
true
для RegExp
.
- person yckart; 17.06.2017
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 на основе этой реализации! И это работает для всех ранее описанных тестовых случаев! ????
isDate
для yourDateObject с целью написания надежного кода, иначе у вас будет хрупкий метод isObject
.
- person cn007b; 19.01.2018
Date
в моем комментарии было неудачно выбрано, потому что да, ответ действительно обсуждает Date
. Но Date
- всего лишь один из бесконечного числа возможных классов, и дело обстоит так и с любым другим классом. Пример: class Foo() { }; var x = new Foo(); isObject(x)
возвращает false
. Я не знаю точно, каков вариант использования OP, но легко представить себе сценарии, в которых нужно знать о всех возможных классах и проверять конкретно на каждый из них i > будет неосуществимо.
- person Yetanotherjosh; 20.01.2018
instanceof
не работает для объектов, созданных из Object.create(null)
.
- person CMCDragonkai; 11.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 < / а>
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);
Это зависит от того, что вы имеете в виду под словом «объект». Если вам нужно все, что не является примитивом, т.е. вещи, для которых вы можете установить новые свойства, это должно помочь:
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.
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.
false
(по желанию), когда anyVar
является функцией.
- person Jamie Birch; 12.02.2019
Наиболее разумным способом проверки типа значения является оператор 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
, не обращаясь к нему напрямую.
Немного поздно ... для простых объектов (я имею в виду, например, {'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, массив или функция. :)
Готовые функции для проверки
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
иfunction
s являются объектами. Хотя,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(){})
);
Попробуй это
if (objectName instanceof Object == false) {
alert('Not an object');
}
else {
alert('An object');
}
Object.prototype instanceof Object
- ›false. Object.create(null) instanceof Object
- ›ложь.
- person Matt Fenwick; 18.03.2014
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]'
return Object.prototype.toString.call(n) === '[object Object]'
- person mesqueeb; 10.06.2018
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
new Error()
будет ложным в вашей функции.
- person TinyRoy; 15.05.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
}
lodash имеет isPlainObject, который может быть тем, что ищут многие посетители этой страницы. Он возвращает false при передаче функции или массива.
_.isObject
, который соответствует тому, что JS считает объектом. Но обычно мне нужно различать, например, литерал объекта и массив, что позволяет мне делать _.isPlainObject
.
- person lime; 16.12.2014
Когда все остальное терпит неудачу, я использую это:
var isObject = function(item) {
return item.constructor.name === "Object";
};
item.constructor === Object
?
- person K3---rnc; 28.02.2016
null
выдает исключение Uncaught TypeError: Cannot read property 'constructor' of null(…)
- person Vitim.us; 17.05.2016
indexOf
или из-за constructor.name
?
- person Jankapunkt; 24.01.2018
Это сработает. Это функция, которая возвращает 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
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"
Поскольку кажется, что существует большая путаница в том, как правильно решить эту проблему, я оставлю свои 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];
}
}());
Прочитав и опробовав множество реализаций, я заметил, что очень немногие люди пытаются проверять такие значения, как JSON
, Math
, document
или объекты с цепочками прототипов длиннее 1 шага.
Вместо того, чтобы проверять typeof
нашей переменной и затем избавляться от крайних случаев, я подумал, что было бы лучше, если бы проверка была как можно более простой, чтобы избежать необходимости рефакторинга, когда добавляются новые примитивы или собственные объекты, которые регистрируются как typeof
из 'объект'.
В конце концов, оператор typeof
сообщит вам, является ли что-то объектом JavaScript, но определение объекта в JavaScript слишком широко для большинства реальных сценариев (например, typeof null === 'object'
). Ниже приведена функция, которая определяет, является ли переменная v
объектом, путем повторения двух проверок:
- Запускается цикл, который продолжается до тех пор, пока строковая версия
v
равна'[object Object]'
.
Я хотел, чтобы результат функции был точно таким же, как в журналах ниже, так что это единственный критерий "объектности", с которым я столкнулся. . В случае неудачи функция сразу же возвращает false. 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'}))))
Для моего кода я обнаружил это решение, которое соответствует некоторым из приведенных выше ответов:
Вариант 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
и так далее..
const isObject = function(obj) {
const type = typeof obj;
return type === 'function' || type === 'object' && !!obj;
};
!!obj
- это сокращение для проверки правдивости obj
(чтобы отфильтровать null
)
Это старый вопрос, но я решил оставить его здесь. Большинство людей проверяют, является ли переменная {}
, что означает пару "ключ-значение", а не то, что является подчеркиванием конструкции, которую 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
true
для new Date()
- person toddmo; 01.01.2020
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!
А вот примеры результатов для хрома
Если вы явно хотите проверить, является ли данное значение {}
.
function isObject (value) {
return value && typeof value === 'object' && value.constructor === Object;
}
function isObjectLike(value) {
return value != null && typeof value == 'object' && !Array.isArray(value);
}
На основе lodash
&& !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
instanceof
для проверки объектов. Тем не менее, это не точная наука.
- person Inanc Gumus; 10.05.2017
new Foo()
возвращает объект Foo
, так же, как new String()
возвращает объект String
, или new Date()
возвращает объект Date
, вы также можете сделать Foo = function(){}; isVarTypeOf(new Foo(), Foo);
- person am05mhz; 12.05.2017
Что мне нравится использовать, так это
function isObject (obj) {
return typeof(obj) == "object"
&& !Array.isArray(obj)
&& obj != null
&& obj != ""
&& !(obj instanceof String) }
Я думаю, что в большинстве случаев дата должна пройти проверку как объект, поэтому я не отфильтровываю даты
вы можете просто использовать JSON.stringify
для тестирования своего объекта, например:
var test = {}
if(JSON.stringify(test)[0] === '{') {
console.log('this is a Object')
}
JSON.stringify(undefined)
вызовет исключение. Мы используем это: function isObject(o) { try { return JSON.stringify(o)[0] === '{' } catch(ex) { return false } }
Однако мы не измеряли производительность.
- person storsoc; 20.03.2020
toJSON
, например Date
s или объекта { toJSON(){ return 1; } }
.
- person Sebastian Simon; 14.05.2020
function isObject(x) {let t= JSON.stringify(x); return t ? t[0] === '{' : false;}
- person Kamil Kiełczewski; 24.09.2020
Если вы уже используете AngularJS, у него есть встроенный метод, который проверяет, является ли он объектом (без принятия null).
angular.isObject(...)
Подумайте - 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));
Самый простой способ определить, является ли переменная Объектом или нет:
сначала: оцените тип объекта
второй: получение свойства массива из объекта должно возвращать undefined
(например, length
- это свойство массива, которое не работает с объектом)
so:
if (_object instanceof Object && _object.length === undefined) {
// here you can be sure that you have a curly bracket object :)
}
В основном используется 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>
Это зависит от варианта использования, если мы не хотим, чтобы массив и функции были объектами, мы можем использовать встроенные функции underscore.js.
function xyz (obj) {
if (_.isObject(obj) && !_.isFunction(obj) && !_.isArray(obj)) {
// now its sure that obj is an object
}
}
Это сложно, потому что массив является типом объекта, функция - типом объекта, а фактический объект {} также является типом объекта.
Проблема
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
Использование 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]))
}
}
null
.
- person Sebastian Simon; 14.05.2020
Помните, ребята, что typeof new Date()
это "object"
.
Поэтому, если вы ищете { key: value }
объектов, объект даты недействителен.
Наконец, на мой взгляд, o => o && typeof o === 'object' && !(o instanceof Date)
- лучший ответ на ваш вопрос.
Небольшой консольный эксперимент 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
прямой ответ, конечно, typeof v==='object'
, но это ужасно бесполезно. Интересно, имел ли OP в виду простой словарь ..
пытаться:
isdict(v) { return v !== undefined && v!==null && typeof v==='object' && v.constructor!==Array && v.constructor!==Date; }
Это легко сделать с помощью метода 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();
}
slice(1, 7)
вместо slice(8,1)
? Возможно, вы захотите немного подробнее рассказать о различиях этих двух методов, например. грамм. последний также принимает null, Number, Array, а первый принимает только «чистые» объекты (например, он не принимает new Number()
, даже если он тоже возвращает объект).
- person le_m; 13.07.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>
false
для объекта Object.assign({}, {constructor: null})
.
- person Sebastian Simon; 14.05.2020
null
объектом). - person   schedule 15.12.2011A javascript object is a javascript object such as '{}'
. Объясните мне, почему null вообще считается объектом? Если вы рассматриваетеnull
объект, вы также можете рассматривать каждую отдельную переменную в javascript какobject
. - person ICW   schedule 12.12.2019