【问题标题】:What is wrong with this way of checking if an object is empty?这种检查对象是否为空的方法有什么问题?
【发布时间】:2021-12-06 08:17:07
【问题描述】:
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,所有问题都有相似的答案,这似乎不必要地复杂。是否存在我提供的代码不起作用的用例,我应该使用链接问题中提供的答案?

【问题讨论】:

  • 请问,为什么要检查对象是否为空?以我的经验,这是一件非常罕见的事情。
  • 您知道"x" in objobj.hasOwnProperty("x") 之间的区别吗?见How do I check if an object has a specific property in JavaScript?
  • 我不确定我是否理解。您无需知道对象是否为空即可在其中搜索键。
  • 对一个人来说“不必要的复杂”对其他人来说是“不够复杂”。您要求提供您提供的代码不起作用的用例,并且正在击落提供这些用例的人。决定是否要简单而不覆盖边缘情况并忽略边缘情况,或者允许复杂情况来捕捉边缘情况。

标签: javascript ecmascript-5


【解决方案1】:

考虑以下情况:

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!

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

【讨论】:

  • @NoobScript 没问题。在更元的层面上,for...in 循环在恕我直言是该语言中的一支枪,除非您真的熟悉语义,否则我会避免使用它。更好的选择是静态 Object 方法,如 Object.keysObject.valuesObject.entriesObject.getOwnPropertyNames 等,它们的语义更清晰。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多