为何函数外部console.log调用函数正常,内部使用console.log却返回undefined?及逻辑或(||)与return执行逻辑的疑问
解答你的FreeCodeCamp编码挑战问题
我来一步步帮你理清这些疑问:
1. 为什么你的初始代码会返回undefined?
问题出在你把console.log()放在了return语句里——console.log()本身的返回值就是undefined,不管它打印了什么内容,这个函数调用的结果都是undefined。所以当你写return console.log(...)时,函数最终返回的就是undefined,而不是你期望的属性值。
看你的初始代码片段:
return console.log(contacts[i][prop]) || console.log('No such property');
不管contacts[i][prop]是否存在,这个return语句都会返回undefined,因为两个console.log()的返回值都是undefined。
而正确代码的做法是:让函数返回实际的值,再在函数外部用console.log()打印这个返回值,这样就能得到你想要的结果,而不是undefined。
2. 逻辑或||怎么起到类似else的作用?
JavaScript中的||是短路逻辑运算符,它的工作规则是:
- 先计算左边的表达式,如果左边是「真值」(比如存在的属性值、非空数组、非空字符串等),就直接返回左边的值,不会再计算右边的表达式
- 如果左边是「假值」(比如
undefined、null、空字符串、0等),才会计算并返回右边的值
在你的场景里,当找到匹配的姓名后:
- 如果
contacts[i][prop]存在(比如Akira的likes属性),左边是真值,直接返回这个属性值 - 如果
contacts[i][prop]不存在(比如传入了一个不存在的属性名),左边会得到undefined(假值),就会返回右边的'No such property'
这就相当于实现了「如果属性存在就返回它,否则返回提示语」的if/else逻辑。
3. 为什么最后的return只在if不成立时执行?
因为return语句会直接终止函数的执行。在你的for循环里:
- 只要找到匹配的
name(if (name == contacts[i].firstName)成立),就会执行return语句,函数立刻结束,循环剩余的迭代和函数末尾的代码都不会再运行 - 只有当整个
for循环跑完,所有联系人都检查过,没有找到匹配的name时,才会走到函数最后的return语句,返回对应的提示语
补充一点:正确代码里最后的return其实也应该返回字符串而不是console.log(),改成return 'No such contact'会更规范,然后统一在函数外部用console.log(lookUpProfile(...))打印结果。
内容的提问来源于stack exchange,提问作者santti_alter
相关产品推荐
相关产品推荐

