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