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

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

Как это сделать?

Ответ 1

Это должно сделать это за вас:

if( Object.prototype.toString.call( someObject ) === '[object Object]' ) {
    // do your iteration
}

От ECMAScript 5 Раздел 8.6.2, если вам интересно:

Значение внутреннего свойства [[Class]] определяется этой спецификацией для каждого типа встроенного объекта. Значение внутреннего свойства [[Class]] объекта-хозяина может быть любым значением String, за исключением одного из "Аргументы", "Массив", "Логическое", "Дата", "Ошибка", "Функция", "JSON", "Math", "Number", "Object", "RegExp" и "String". Значение внутреннего свойства [[Class]] используется внутри, чтобы различать различные типы объектов. Обратите внимание, что эта спецификация не предоставляет никаких средств для доступа к этому значению для программы, кроме как через Object.prototype.toString(см. 15.2.4.2).

Ответ 2

Вы также можете сделать что-то вроде:

    if (someObject.constructor == Object) {
        // do your thing
    }

вы можете прочитать об этом здесь

Ответ 3

Я думаю, что такая функция должна быть родной, как и Array.isArray:

Object.isObject = function(obj) {
    return obj && obj.constructor === this || false;
};

Этот вызов не выполняет вызовы функций и сравнения строк и не ссылается на глобальные объекты (например, Object), поэтому он должен быть довольно быстрым. Я не думаю, что это будет использоваться в задачах, требующих высокой производительности, но что бы то ни было.

Я не совсем уверен в имени... может быть, что-то вроде Object.isLiteral будет лучше.

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

Ответ 4

Скажите, что у вас есть testvar и вы хотите увидеть, является ли это объектом, но не массивом или нулем (это оба типа Object). Вы можете сделать следующее

testVar instanceof Object && !Array.isArray(testVar) && testVar !== null

Ответ 5

Странно, но я вижу разные значения toString() для подкласса объекта в зависимости от того, как вызывается toString():

Object.prototype.toString.call(aThing)
"[object Object]"

aThing.toString()
"ZmPopupMenu"

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

var str = someObject.toString
    ? someObject.toString()
    : Object.prototype.toString.call(someObject);
return str === '[object Object]';

Ответ 6

Ну, вам не нужно проверять все самостоятельно или писать свои собственные коды, когда есть хорошие библиотеки, такие как Lodash и Underscore.

В Lodash вы можете легко проверить его с помощью функции isPlainObject, например:

_.isPlainObject({'a': 12});

Проверьте эту страницу: https://lodash.com/docs#isPlainObject

Ответ 7

Vanilla Javascript-версия функции JQuery.isPlainObject.

var class2type = {};
var toString = class2type.toString;
var getProto = Object.getPrototypeOf;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString;
var ObjectFunctionString = fnToString.call(Object);

function isPlainObject(obj) {
  var proto, Ctor;

  // Detect obvious negatives
  // Use toString instead of jQuery.type to catch host objects
  if (!obj || toString.call(obj) !== "[object Object]") {
    return false;
  }

  proto = getProto(obj);

  // Objects with no prototype (e.g., 'Object.create( null )') are plain
  if (!proto) {
    return true;
  }

  // Objects with prototype are plain iff they were constructed by a global Object function
  Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
  return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
}

Пример:

isPlainObject({}) // true
isPlainObject( "test" ) // false

Ответ 8

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

Чтобы проверить, является ли переменная объектом, следует использовать следующее:

if (typeof variable === 'object') {
    // do something
}

Массивы также являются объектами, поэтому это также верно для массива. Более того - null также является допустимым объектом, поэтому выше вернет true и на null. Лично, когда действительно нужно проверить, является ли ожидаемая переменная "работоспособным" объектом, я всегда использую эту скучно повторяющуюся формулу:

if (variable && typeof variable === `object`) {
    // do something
}

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

Ответ 9

Маленькая сущность, не очень элегантная, но эффективная

function _isObj( _obj ){

   return ( typeof _obj === "object" && JSON.stringify( _obj ).indexOf( "{" ) == 0 ); 

}

Маленький пример

function _isObj( _obj ){

   return ( typeof _obj === "object" && JSON.stringify( _obj ).indexOf( "{" ) == 0 ); 

}

var p = document.createElement( "p" );
p.textContent = "undefined : " + _isObj( undefined );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "null : " + _isObj( null );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "boolean : " + _isObj( true );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "function : " + _isObj( function(){} );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "array : " + _isObj( [] );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "string : " + _isObj( "{}" );
document.body.appendChild( p );
document.body.appendChild( p );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "number : " + _isObj( 1 );
document.body.appendChild( p );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "object : " + _isObj( {} );
document.body.appendChild( p );

p = document.createElement( "p" );
p.textContent = "another object : " + _isObj( p );
document.body.appendChild( p );

Ответ 10

Это работает для меня:

function isObject(o) {
    try {
        return ((typeof o == "object") && (o !== null) && (o.length === undefined));
    } catch (err) {
        return false;
    }
}