if与return语句问题排查:循环中条件语句位置错误定位
解决对象属性检查函数的循环if位置问题
兄弟,太懂你这种“明明知道问题出在if位置,但就是摸不准具体哪里错”的纠结了!咱们拿你给的contacts数组当例子,先拆解最容易踩的两个坑,再给你正确的写法。
常见错误1:把判断逻辑放在循环外面
很多人一开始会写成这样:
function lookUpProfile(name, prop) { for (let i = 0; i < contacts.length; i++) { // 空跑循环,啥判断都没做 } // 循环结束才检查,这时候i已经等于数组长度了,contacts[i]直接是undefined! if (contacts[i].firstName === name) { return contacts[i][prop] || "No such property"; } return "No such contact"; }
问题出在:循环跑完后,i的值已经超出了数组的索引范围,这时候访问contacts[i]会直接报错,更别说匹配目标联系人了——等于白循环了一遍。
常见错误2:循环内的return时机不对,逻辑分支不全
还有一种典型错误是这样的:
function lookUpProfile(name, prop) { for (let i = 0; i < contacts.length; i++) { if (contacts[i].firstName === name) { // 找到联系人就直接返回属性,但如果属性不存在,会返回undefined,不是预期的提示 return contacts[i][prop]; } // 第一个联系人不匹配就直接返回,后面的联系人根本没机会被检查! return "No such contact"; } }
这里的问题有两个:一是return "No such contact"放在循环里,只要第一个联系人不匹配,函数直接结束,完全跳过了后面的对象;二是找到联系人后,没检查属性是否存在,会返回undefined而不是你想要的“No such property”提示。
正确的写法:把if放在循环内部,分支逻辑写全
咱们把判断逻辑嵌套在循环里,一步步处理:
var contacts = [ { "firstName": "Akira", "lastName": "Laine", "number": "0543236543", "likes": ["Pizza", "Coding", "Brownie Points"] }, { "firstName": "Harry", "lastName": "Potter", "number": "0994372684", "likes": ["Hogwarts", "Magic..."] } ]; function lookUpProfile(name, prop) { // 遍历每一个联系人对象 for (let i = 0; i < contacts.length; i++) { // 先判断当前对象的姓名是否匹配目标 if (contacts[i].firstName === name) { // 姓名匹配后,再检查是否有目标属性 if (contacts[i].hasOwnProperty(prop)) { return contacts[i][prop]; // 有属性就返回属性值 } else { return "No such property"; // 没属性就返回提示 } } } // 整个循环跑完都没找到匹配的姓名,返回这个提示 return "No such contact"; }
关键逻辑说明:
- 把姓名判断的
if放在循环内部,每遍历一个对象就检查一次,一旦找到匹配的,立刻进入属性检查的分支 - 在姓名匹配的分支里,再用
hasOwnProperty(比直接访问更安全)检查属性是否存在,处理两种情况:有属性返回值,没属性返回提示 - 只有当所有对象都遍历完,都没找到匹配的姓名时,才返回“No such contact”——这个return必须放在循环外面,确保所有对象都被检查过
内容的提问来源于stack exchange,提问作者mrwallace3
相关产品推荐
相关产品推荐

