这种检查对象是否为空的方法有什么问题?
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!
所以这是您的函数遗漏的两个极端情况。您可能不想在第一个示例中记录任何内容,并且您可能 想在第二个示例中记录密钥。
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!
所以这是您的函数遗漏的两个极端情况。您可能不想在第一个示例中记录任何内容,并且您可能 想在第二个示例中记录密钥。