У меня есть значение и вы хотите знать, является ли он итерационным литералом объекта, прежде чем я его повторю.
Как это сделать?
У меня есть значение и вы хотите знать, является ли он итерационным литералом объекта, прежде чем я его повторю.
Как это сделать?
Это должно сделать это за вас:
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).
Вы также можете сделать что-то вроде:
if (someObject.constructor == Object) {
// do your thing
}
вы можете прочитать об этом здесь
Я думаю, что такая функция должна быть родной, как и Array.isArray
:
Object.isObject = function(obj) {
return obj && obj.constructor === this || false;
};
Этот вызов не выполняет вызовы функций и сравнения строк и не ссылается на глобальные объекты (например, Object
), поэтому он должен быть довольно быстрым. Я не думаю, что это будет использоваться в задачах, требующих высокой производительности, но что бы то ни было.
Я не совсем уверен в имени... может быть, что-то вроде Object.isLiteral
будет лучше.
Это может вызвать проблему с объектами хоста, но у меня нет готового теста.
Скажите, что у вас есть testvar
и вы хотите увидеть, является ли это объектом, но не массивом или нулем (это оба типа Object). Вы можете сделать следующее
testVar instanceof Object && !Array.isArray(testVar) && testVar !== null
Странно, но я вижу разные значения 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]';
Ну, вам не нужно проверять все самостоятельно или писать свои собственные коды, когда есть хорошие библиотеки, такие как Lodash и Underscore.
В Lodash вы можете легко проверить его с помощью функции isPlainObject, например:
_.isPlainObject({'a': 12});
Проверьте эту страницу: https://lodash.com/docs#isPlainObject
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
Накапливая старый поток, но он все еще появляется в результатах поиска, и люди даже ссылаются на него как на дубликат для новых подобных - и все же самые верные ответы здесь далеко от правильного (извините люди, без обид).
Чтобы проверить, является ли переменная объектом, следует использовать следующее:
if (typeof variable === 'object') {
// do something
}
Массивы также являются объектами, поэтому это также верно для массива.
Более того - null
также является допустимым объектом, поэтому выше вернет true и на null
.
Лично, когда действительно нужно проверить, является ли ожидаемая переменная "работоспособным" объектом, я всегда использую эту скучно повторяющуюся формулу:
if (variable && typeof variable === `object`) {
// do something
}
И последнее, но не менее важное: пожалуйста, пожалуйста, сделайте себе одолжение и не используйте библиотеки для таких простых вещей. Javascript - это быстро развивающийся язык, который сегодня намного больше, чем вчера, настолько быстрый, что большинство библиотек даже не достаточно быстры, чтобы забираться. Кроме того, люди, которые работают над спецификацией, отлично справляются с работой, и в основном собственные API-интерфейсы являются чистыми, правильными, совершенствуются и согласуются с остальной частью языка.
Маленькая сущность, не очень элегантная, но эффективная
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 );
Это работает для меня:
function isObject(o) {
try {
return ((typeof o == "object") && (o !== null) && (o.length === undefined));
} catch (err) {
return false;
}
}