我有一个值,想要在迭代它之前知道它是否是一个可迭代的对象文字。
我该怎么做?
答案 0 :(得分:39)
这应该适合你:
if( Object.prototype.toString.call( someObject ) === '[object Object]' ) {
// do your iteration
}
来自 ECMAScript 5第8.6.2节,如果您有兴趣:
[[Class]]内部属性的值由此规范为每种内置对象定义。主机对象的[[Class]]内部属性的值可以是除“Arguments”,“Array”,“Boolean”,“Date”,“Error”,“Function”,“JSON”之一之外的任何String值。 ,“数学”,“数字”,“对象”,“RegExp”和“字符串”。内部使用[[Class]]内部属性的值来区分不同类型的对象。请注意,除了通过Object.prototype.toString之外,此规范不提供程序访问该值的任何方法(参见15.2.4.2)。
答案 1 :(得分:6)
答案 2 :(得分:3)
我认为像这样的函数应该是原生的,就像Array.isArray
:
Object.isObject = function(obj) {
return obj && obj.constructor === this || false;
};
这个不进行函数调用,也不进行字符串比较,也不引用全局对象(如Object
),所以它应该非常快。我不认为这会用于性能密集型任务,但无论如何。
我并不完全相信这个名字......也许像Object.isLiteral
这样的东西会更好。
但它可能会导致主机对象出现问题,但我没有准备好测试。
答案 3 :(得分:2)
假设您有一些testvar
并且想要查看它是否是对象,而不是数组或null(这些都是Object类型)。您可以执行以下操作
testVar instanceof Object && !Array.isArray(testVar) && testVar !== null
答案 4 :(得分:0)
奇怪的是,根据如何调用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]';
答案 5 :(得分:0)
嗯,当有好的库,例如 Lodash 和 Underscore 强>
在Lodash中,您可以通过isPlainObject函数轻松检查它,例如:
_.isPlainObject({'a': 12});
答案 6 :(得分:0)
JQuery.isPlainObject函数的香草Javascript版本。
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
答案 7 :(得分:0)
如果使用obj instanceof Object
或typeof obj === "object"
,则会对new Number(3)
和数组([1,2,3]
)之类的东西产生误报。
使用o.constructor === Object
很棒,但是Object.create(null)
有一个奇怪的情况–实际上,它确实给了您一个普通的对象,尽管不是以“常规”方式创建的。从概念上讲,它提供了有效的,正常的,未装饰的对象。我们使用Object.getPrototypeOf(o) === null
检查这种情况,该情况仅适用于上述未经修饰的对象类型。
!!o
将null
或undefined
转换为false
。上面有人在抱怨它,说实话o && ...
更简洁,除非您要序列化,否则没关系。不过,我将其包含在内。
function isObject(o) {
return o && o.constructor === Object
}
function isObject1(o) {
return !!o && o.constructor === Object
}
function isObject2(o) {
// edge case where you use Object.create(null) –– which gives an object {} with no prototype
return !!o && (Object.getPrototypeOf(o) === null || o.constructor === Object)
}
答案 8 :(得分:0)
const isObject = (x) => {
return Object.prototype.toString.call(x) == "[object Object]";
}
对我有用。
答案 9 :(得分:-1)
比较旧的帖子,但它仍然出现在搜索中,人们甚至将它作为新的类似的重复引用 - 而且这里最顶层的答案仍然是远是正确的(对不起人,没有冒犯)。
要检查变量是否为对象,应使用以下内容:
if (typeof variable === 'object') {
// do something
}
数组也是对象,所以对于数组也是如此。
此外 - null
也是一个有效的对象,因此上面的内容也会在null
上返回true。
就个人而言,当真正需要检查预期变量是否可行时,可以使用#39;对象我总是使用这个重复的公式:
if (variable && typeof variable === `object`) {
// do something
}
最后但并非最不重要:)请,请帮助自己,不要使用任何库来做这么简单的事情。 Javascript是一种快速发展的语言,今天比昨天更加快,以至于大多数库甚至都不够快,无法获取。 除此之外,正在制定规范的人员工作做得很好,而且大多数原生API都是干净,正确,非常有意义并且与语言的其他部分保持一致。
答案 10 :(得分:-1)
小小的要点,不是很优雅而是高效
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 );

希望这个帮助
答案 11 :(得分:-2)
这对我有用:
function isObject(o) {
try {
return ((typeof o == "object") && (o !== null) && (o.length === undefined));
} catch (err) {
return false;
}
}