
在编写联系人查找函数时,将 return "No such contact" 放在 for 循环外部是确保遍历全部联系人后再判定“未找到”的关键;若将其置于 else 分支中,函数会在首次不匹配时立即退出,导致漏查后续有效项。
在编写联系人查找函数时,将 `return "no such contact"` 放在 for 循环外部是确保遍历全部联系人后再判定“未找到”的关键;若将其置于 else 分支中,函数会在首次不匹配时立即退出,导致漏查后续有效项。
在 freeCodeCamp 的 Profile Lookup 挑战中,核心目标是:给定姓名(name)和属性名(prop),从 contacts 数组中查找匹配的联系人,并返回其对应属性值;若姓名不存在,返回 "No such contact";若姓名存在但属性不存在,返回 "No such property"。
问题根源在于 函数提前终止。来看错误写法:
function lookUpProfile(name, prop) {
for (let n = 0; n < contacts.length; n++) {
if (name === contacts[n].firstName && contacts[n].hasOwnProperty(prop)) {
return contacts[n][prop]; // ✅ 找到即返回 —— 正确
} else {
return "No such contact"; // ❌ 错误!每次不匹配就立刻返回并退出函数
}
}
}这段代码在 n = 0(即检查第一个联系人 "Akira")时,若传入 lookUpProfile("Kristian", "lastName"),因 "Akira" !== "Kristian",立即执行 else 中的 return "No such contact",函数就此终止——根本不会检查索引 1、2、3 的其他联系人。这就是为何输出总是 "No such contact",哪怕目标 "Kristian" 明明存在。
✅ 正确逻辑应是:
- 只在确认找到时立即返回属性值(满足条件 → 返回结果);
-
只有遍历完所有联系人仍未匹配,才判定“联系人不存在” → 此时在循环 之后 统一返回
"No such contact"。
标准实现如下:
function lookUpProfile(name, prop) {
for (let i = 0; i < contacts.length; i++) {
const contact = contacts[i];
if (contact.firstName === name) {
// 姓名匹配 → 检查属性是否存在
return contact.hasOwnProperty(prop)
? contact[prop]
: "No such property";
}
}
// 循环结束仍未 return → 姓名完全未找到
return "No such contact";
}⚠️ 关键注意事项:
-
return是函数终止指令:一旦执行,函数立即结束,后续代码(包括循环剩余迭代)不再运行; -
else不应包含return "No such contact",因为它代表“当前项不匹配”,而非“全局无匹配”; - 属性存在性检查(
hasOwnProperty)必须在确认姓名匹配后进行,避免对undefined调用方法报错; - 使用严格相等
===替代==,防止类型隐式转换引发意外行为。
总结:循环中的 return 应仅用于“成功路径”(找到即返回),而“失败路径”(未找到)必须延迟至循环结束后统一处理。这是遍历型查找函数的通用范式,也是理解 JavaScript 执行流与作用域的重要实践。

















