这种检查对象是否为空的方法有什么问题?

What is wrong with this way of checking if an object is empty?

function isEmpty(obj) {
  for(var key in obj) {
    return false;
    }
    return true;
}

这种检查对象是否为空的方法有什么问题?我对 JS 很陌生, 我正在通过 SO 检查检查对象是否为空的最好和最快的方法是什么 How do I test for an empty JavaScript object? 等等。

所有问题都有相似的答案检查 Object.prototype.hasOwnProperty 这似乎不必要地复杂。是否存在我提供的代码不起作用的用例,我应该使用链接问题中提供的答案?

考虑以下情况:

const foo = { a: 1 }
const bar = {}
Object.setPrototypeOf(bar, foo)
console.log(bar) // {}
for (let key in bar) console.log(key) // logs a!!

这就是我在关于遍历原型链的评论中的意思。

还要考虑这个:

const foo = {}
Object.defineProperty(foo, 'a', {
  enumerable: false,
  value: 1,
})
console.log(foo.a) // 1
for (let key in foo) console.log(key) // doesn't log anything!

所以这是您的函数遗漏的两个极端情况。您可能不想在第一个示例中记录任何内容,并且您可能 想在第二个示例中记录密钥。