Javascript 如何确定对象是否包含内容?

Javascript 如何确定对象是否包含内容?,javascript,Javascript,如果我这样设置一个变量: var a = {}; 检查是否有任何内容 var b = { x: 1 } 检查是否有任何内容 var c = { y: null } 我认为测试(a)不起作用,因为它不是空的。那么,如果我事先不知道内容是什么,我如何检查它是否有一些内容?在这种情况下,我希望变量b和c显示为包含内容。下面是jQuery的一段代码: // ... isEmptyObject: function( obj ) { var name; for ( name in ob

如果我这样设置一个变量:

var a = {};
检查是否有任何内容

var b = { x: 1 }
检查是否有任何内容

var c = { y: null }

我认为测试(a)不起作用,因为它不是空的。那么,如果我事先不知道内容是什么,我如何检查它是否有一些内容?在这种情况下,我希望变量
b
c
显示为包含内容。

下面是jQuery的一段代码:

// ...
isEmptyObject: function( obj ) {
    var name;
    for ( name in obj ) {
        return false;
    }
    return true;
},
// ...

有点罗嗦,但这应该行得通:

var hasProperties = false;
for(var prop in obj) {
    hasProperties = true;
    break;
}

请尝试
if(Object.keys(a.length)

许多答案,但我想您应该检查对象的属性:

for (var p in obj) {
  if (obj.hasOwnProperty(p)) {
    // obj has at least one enumerable own property
  }
}
但请注意,在ES5中,可以使用不可枚举的自身属性构造对象:

function hasEnumerableOwnProperties(obj) {
  for (var p in obj) {
    if (obj.hasOwnProperty(p)) return true;
  }
  return false;
}

var obj = {}

Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})

console.log(hasEnumerableOwnProperties(obj) + ':' + obj.foo); // false:foo
Javascript并不是为适应这种分析而设计的,如果您针对某个特定的属性、特性或属性进行测试(即使用特性检测),它会更好


不要试图根据一个简单的(通常是不确定的)测试(duck类型)来推断一些一般行为。

应该提到的是(这不是大多数人关心的问题,但值得注意的是)函数不会被严格化为JSON@xdazz-
JSON.stringify({foo:function(),这是真的。对于固有的可枚举属性呢?应使用此方法检测继承的可枚举属性,正如我所假设的,这对OP是有利的行为。不过,根据“如果我设置一个变量,如var a={…}”的场景,继承不应该是一个问题。我想它强调了一般用途的无效性“is plain object”测试,它们都只能在有限的一组标准内工作。在上面,使用可枚举属性扩展object.prototype意味着所有对象都“有内容”。
function hasEnumerableOwnProperties(obj) {
  for (var p in obj) {
    if (obj.hasOwnProperty(p)) return true;
  }
  return false;
}

var obj = {}

Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})

console.log(hasEnumerableOwnProperties(obj) + ':' + obj.foo); // false:foo