freeCodeCamp资料查询挑战:为何for循环内return返回错误结果?
关于freeCodeCamp Profile Lookup挑战的return位置问题解析
问题背景
在完成freeCodeCamp的Profile Lookup挑战时,我始终搞不懂为什么return "No such contact"必须放在for循环外面。最开始我把它作为if语句的else分支,结果代码总是返回"No such contact",而不是目标属性值。虽然知道要等循环完成所有迭代后再执行return,但不清楚具体原因和代码失效的机制。
错误代码及失效原因
错误版本代码如下:
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" } } }
当调用console.log(lookUpProfile("Kristian", "lastName"))时,结果为"No such contact",但实际应该返回"Vos"。
问题出在return语句的特性上:一旦函数执行到return,会立刻终止整个函数的运行。在错误代码里,第一次循环(n=0)时,当前联系人是"Akira",和目标名字"Kristian"不匹配,直接触发else分支,执行return "No such contact",函数直接结束,根本没机会遍历后面的联系人(包括索引3的Kristian)。这就导致循环还没找到目标就提前终止,返回了错误结果。
正确代码及逻辑说明
修正后的完整代码如下:
// Setup 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) { // Only change code below this line let n = 0; // index of contacts array for(n = 0; n<contacts.length; n++ ){ if(name == contacts[n].firstName){ return contacts[n][prop] || "No such property" } } return "No such contact" // Only change code above this line } lookUpProfile("Akira", "likes");
这里的核心逻辑是:
- 循环会逐个遍历所有联系人,只要找到匹配名字的项,就直接return对应的属性值(如果属性不存在,
contacts[n][prop]会是undefined,触发||后的"No such property"),函数终止。 - 只有当循环完整遍历完所有联系人都没找到匹配名字时,才会执行循环外面的
return "No such contact",这才符合"没有该联系人"的判断逻辑。
内容的提问来源于stack exchange,提问作者szayel
相关产品推荐
相关产品推荐

