JS for循环实现联系人查找时"No such contact"为何放在循环外
练习场景
我正在练习使用For循环遍历存储多个联系人详情对象的数组,所用练习数据如下:
const contacts = [ { firstName: "Akira", lastName: "Laine", number: "0543236543", likes: ["Pizza", "Coding", "Brownie Points"], }, { firstName: "Harry", lastName: "Potter", number: "0994372684", likes: ["Hogwarts", "Magic", "Hagrid"], }, { firstName: "Sherlock", lastName: "Holmes", number: "0487345643", likes: ["Intriguing Cases", "Violin"], }, { firstName: "Kristian", lastName: "Vos", number: "unknown", likes: ["JavaScript", "Gaming", "Foxes"], }, ];
函数实现要求
需要实现function lookUpProfile(name, prop)查询函数,规则如下:
- 在
contacts数组中查找firstName与传入name参数匹配的联系人 - 若匹配联系人存在:
- 检查该对象是否存在传入的
prop属性,属性存在则返回对应属性值 - 属性不存在则返回
"No such property"
- 检查该对象是否存在传入的
- 若遍历完整个数组都没找到匹配
name的联系人,返回"No such contact"
参考实现代码
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"; }
问题说明
为什么上述代码中返回"No such contact"的语句需要放置在For循环外部?是否可以将该语句写在循环内部?
解答
不可以不加判断就把"No such contact"的返回语句直接写在循环内部,核心原因和For循环的执行逻辑、return的终止特性直接相关:
- 函数里的
return语句会立刻终止当前函数执行,把结果返回给调用方。For循环是逐一遍历数组元素的,只要还没遍历完所有元素,就不能下定论说「数组里没有匹配的联系人」。如果把返回"No such contact"的语句直接放在循环体内、匹配名字的判断分支外,那只要检查到第一个不匹配的联系人,函数就会直接返回找不到,根本不会继续遍历后面的元素,结果完全错误。 - 现有循环外写返回的逻辑是最简洁合理的:循环遍历过程中只要找到匹配名字的联系人,就会立刻进入内部判断分支,触发
return终止函数,返回对应的属性值或者属性不存在的提示;只有当循环完整跑完所有联系人、全程没有触发任何内部return的时候,才能确定整个数组里确实没有匹配的联系人,这时候再返回"No such contact"完全符合逻辑。
并非完全不能把这条返回逻辑写在循环里,但必须加严格的前置判断:比如只有当循环走到最后一个元素(即
i === contacts.length - 1)、且当前元素依然不匹配目标name时,才能返回"No such contact"。但这种写法会增加冗余判断,可读性和简洁度远不如放在循环外部的写法。
下面是把返回语句错放在循环内部的反例,可以直接测试验证问题:
// 典型错误写法 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"; } }
这个错误写法下,只要查询的不是第一个联系人Akira,哪怕目标联系人Harry、Sherlock确实在数组里,函数都会在检查完第一个元素后直接返回"No such contact",结果完全不符合预期。
内容的提问来源于stack exchange,提问作者Juan Yeremia
相关产品推荐
相关产品推荐

