You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:35:24