freeCodeCamp Profile Lookup两种方案对比:hasOwnProperty的差异与选择
Profile Lookup挑战:两种判断逻辑的核心差异
我完成了freeCodeCamp的Profile Lookup挑战,自己的解决方案能运行,但看到提示里的另一个方案,唯一区别是用了hasOwnProperty()方法。我的方案判断时依赖contacts[i][prop]的真假(不存在时返回undefined),而另一个方案返回布尔值,想了解两者除返回值类型外是否还有其他差异?
我的解决方案
function lookUpProfile(name, prop) { // Only change code below this line for (let i = 0; i < contacts.length; i++) { if (contacts[i]["firstName"] === name) { if (contacts[i][prop]) { return contacts[i][prop] } else { return "No such property" } } } return "No such contact" // Only change code above this line }
其他解决方案
function lookUpProfile(name, prop) { // Only change code below this line 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" // Only change code above this line }
两者的核心差异远不止返回值类型,而是判断逻辑的本质不同:
你的方案:
if (contacts[i][prop])是在判断属性值是否为「真值」(truthy)。JavaScript中,0、""、false、null、undefined、NaN都是假值。如果属性存在但值为假,这个判断会错误地认为「属性不存在」,进而返回"No such property"。
比如如果某个联系人有age: 0,调用lookUpProfile("Alice", "age")时,你的代码会返回"No such property",但实际上age属性是存在的,只是值为0。使用
hasOwnProperty()的方案:这个方法是严格判断对象自身是否包含指定属性,完全不关心属性值是什么——只要属性存在,就返回true;不存在则返回false。这才符合挑战的核心需求:判断属性是否存在,而不是属性值是否为真。
举个具体的测试场景:
假设contacts数组中有如下对象:
{ firstName: "Alice", age: 0, isStudent: false, bio: "" }
- 调用
lookUpProfile("Alice", "age"):你的代码返回"No such property",正确方案返回0 - 调用
lookUpProfile("Alice", "isStudent"):你的代码返回"No such property",正确方案返回false - 调用
lookUpProfile("Alice", "bio"):你的代码返回"No such property",正确方案返回""
只有当属性不存在(返回undefined,属于假值)时,两个方案的结果才一致。但只要属性存在且值为假,你的方案就会触发错误的分支。
内容的提问来源于stack exchange,提问作者Murilo Cabral
相关产品推荐
相关产品推荐

