检查该值是否为对象字面值?

时间:2010-12-01 02:48:32

标签: javascript

我有一个值,想要在迭代它之前知道它是否是一个可迭代的对象文字。

我该怎么做?

12 个答案:

答案 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)

您还可以执行以下操作:

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

您可以阅读更多相关信息here

答案 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});

查看此页面:https://lodash.com/docs#isPlainObject

答案 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 Objecttypeof obj === "object",则会对new Number(3)和数组([1,2,3])之类的东西产生误报。

使用o.constructor === Object很棒,但是Object.create(null)有一个奇怪的情况–实际上,它确实给了您一个普通的对象,尽管不是以“常规”方式创建的。从概念上讲,它提供了有效的,正常的,未装饰的对象。我们使用Object.getPrototypeOf(o) === null检查这种情况,该情况仅适用于上述未经修饰的对象类型。

!!onullundefined转换为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;
    }
}