Answers:
您可以如下遍历对象的属性:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
使用该hasOwnProperty()
方法确定对象是否具有指定的属性作为直接属性,而不是从对象的原型链继承,这一点很重要。
从注释中: 您可以将该代码放入函数中,并在到达注释部分后立即将其返回false。
性能测试
Object.keys
将是最简单:var a = [1,2,3];a.something=4;console.log(Object.keys(a))
因为它已经ECMA 5的一部分,你可以放心地匀它:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})
。
您可以使用内置Object.keys
方法来获取对象上的键列表并测试其长度。
var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values
if(Object.keys(x).length > 0){
// Your code here if x has some properties
}
var str = "MyString"; Object.keys(str);
,控制台为每个字符输出0到7之间的8个键。还是我还是不明白答案。
做一个简单的函数呢?
function isEmptyObject(obj) {
for(var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
isEmptyObject({}); // true
isEmptyObject({foo:'bar'}); // false
该hasOwnProperty
方法调用直接上Object.prototype
只加一点更安全,试想使用正常以下obj.hasOwnProperty(...)
电话:
isEmptyObject({hasOwnProperty:'boom'}); // false
注意:( 将来) 上述方法依赖于该for...in
语句,并且该语句仅在可枚举的属性上进行迭代,在当前使用最广泛的ECMAScript Standard(第3版)中,程序员没有任何方法来创建不可枚举的属性。
但是,现在ECMAScript 5th Edition已经改变了这一点,并且我们能够创建不可枚举,不可写或不可删除的属性,因此上述方法可能会失败,例如:
var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal',
enumerable: false,
writable: true,
configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!
针对此问题的ECMAScript 5解决方案是:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
该Object.getOwnPropertyNames
方法返回一个Array
含有的名称所有的自己的属性的对象的,枚举与否,现在正在实施的浏览器厂商这种方法,它已经在Chrome 5 Beta版和最新的WebKit的每晚构建。
Object.defineProperty
在这些浏览器和最新的Firefox 3.7 Alpha版本上也可用。
hasOwnProperty
属性,则该函数可能会崩溃...我知道我有点偏执...但是有时您不知道您的代码将在哪种环境中使用,但是你知道你想使用什么方法...
Object.prototype
,则不会被枚举for...in
。所以isEmptyObject({toString:1})
会失败。这是你不能不幸的原因之一相当使用Object
作为一个通用的映射。
使用jQuery,您可以使用:
$.isEmptyObject(obj); // Returns: Boolean
从jQuery 1.4开始,此方法同时检查对象本身的属性和从原型继承的属性(因为它不使用hasOwnProperty)。
使用现代浏览器(IE9 +,FF4 +,Chrome5 +,Opera12 +,Safari5 +)中的ECMAScript 5th Edition,您可以使用内置的Object.keys方法:
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
或普通的旧JavaScript:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};
最新的浏览器(和node.js)都支持Object.keys(),它返回一个数组,其中包含对象文字中的所有键,因此您可以执行以下操作:
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
浏览器支持:Firefox 4,Chrome 5,Internet Explorer 9,Opera 12,Safari 5
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
如果您使用的是underscore.js,则可以使用_.isEmpty函数:
var obj = {};
var emptyObject = _.isEmpty(obj);
_.isEmpty([]) // true
请务必先检查:stackoverflow.com/a/22482737/1922747
_.some([1, 2]) // true
请务必先检查:stackoverflow.com/a/13356338/1922747
for (var hasProperties in ad) break;
if (hasProperties)
... // ad has properties
如果您必须安全并检查对象原型(这些原型是由某些库添加的,并且默认情况下不存在):
var hasProperties = false;
for (var x in ad) {
if (ad.hasOwnProperty(x)) {
hasProperties = true;
break;
}
}
if (hasProperties)
... // ad has properties
for(var memberName in ad)
{
//Member Name: memberName
//Member Value: ad[memberName]
}
成员表示成员属性,成员变量,无论您想调用什么> _>
上面的代码将返回所有信息,包括toString ...如果仅想查看对象的原型是否已扩展:
var dummyObj = {};
for(var memberName in ad)
{
if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
//Member Name: memberName
//Member Value: ad[memberName]
}
注意A:我们检查虚拟对象的成员是否与测试对象的成员具有相同的类型。如果是扩展,则dummyobject的成员类型应为“未定义”
当确定对象是用户定义的对象时,确定UDO是否为空的最简单方法是以下代码:
isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};
即使此方法(从本质上来说)是一种演绎方法,但它是最快,最快的方法。
a={};
isEmpty(a) >> true
a.b=1
isEmpty(a) >> false
ps :!请勿在浏览器定义的对象上使用它。
您可以使用以下内容:
双砰!属性查询
var a = !![]; // true
var a = !!null; // false
hasOwnProperty 这是我以前使用的东西:
var myObject = {
name: 'John',
address: null
};
if (myObject.hasOwnProperty('address')) { // true
// do something if it exists.
}
但是,JavaScript决定不保护该方法的名称,因此可能会对其进行篡改。
var myObject = {
hasOwnProperty: 'I will populate it myself!'
};
myObject中的prop
var myObject = {
name: 'John',
address: null,
developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.
类型
if (typeof myObject.name !== 'undefined') {
// do something
}
但是,它不会检查null。
我认为这是最好的方法。
在运算符中
var myObject = {
name: 'John',
address: null
};
if('name' in myObject) {
console.log("Name exists in myObject");
}else{
console.log("Name does not exist in myObject");
}
结果:
名称存在于myObject中
这是一个有关in运算符的详细链接:确定对象属性是否存在
ES6功能
/**
* Returns true if an object is empty.
* @param {*} obj the object to test
* @return {boolean} returns true if object is empty, otherwise returns false
*/
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0
例子:
let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true
obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false