С функцией 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! И это работает для всех ранее описанных тестовых случаев! ?