JavaScript for...in循环未遍历全集合返回错误布尔值问题
JavaScript truthCheck函数执行异常问题
问题表现
- 传入的对象集合中每个元素都包含
name属性,但函数执行后返回错误的布尔值false - 在
for...in循环内打印prop变量仅得到0,循环没有遍历集合内的全部对象
问题复现代码
function truthCheck(collection, pre) { for (let prop in collection) { console.log(prop) if (collection[prop].hasOwnProperty(pre) && Boolean(collection.forEach((item) => item[pre]))) { return true } else return false } } console.log(truthCheck([{ name: "Quincy", role: "Founder", isBot: false }, { name: "Naomi", role: "", isBot: false }, { name: "Camperbot", role: "Bot", isBot: true }], "name"))
错误原因
- 循环提前终止:
for...in的判断分支中,无论if条件是否成立,都会执行return语句,第一次循环(对应数组索引0)执行完就直接退出函数,完全不会进入后续遍历流程,这是prop只打印出0的核心原因。 - 真值判断逻辑无效:
Array.forEach方法本身没有返回值,固定返回undefined,Boolean(undefined)的结果永远为false,因此判断条件永远无法成立。 - 校验逻辑不符合需求:
truthCheck的预期逻辑是集合内所有对象都存在指定属性、且属性值为真值时才返回true,原代码只要匹配到第一个元素就尝试返回true,逻辑顺序完全颠倒。
修正方案
直接使用数组的every方法实现全量校验,every会遍历所有元素,仅当所有元素都满足传入的判断条件时才返回true,只要存在一个不满足的元素就会提前返回false,完全匹配需求:
function truthCheck(collection, pre) { return collection.every(item => item.hasOwnProperty(pre) && Boolean(item[pre])) } // 测试传入name属性的用例,输出true console.log(truthCheck([{ name: "Quincy", role: "Founder", isBot: false }, { name: "Naomi", role: "", isBot: false }, { name: "Camperbot", role: "Bot", isBot: true }], "name"))
内容的提问来源于stack exchange,提问作者CRISVOSS
相关产品推荐
相关产品推荐

