即使它们在逻辑上相同,为什么我得到不同的输出?

Even though they are logically the same, why am I getting different outputs?

第一次在这里提问,如有重复请见谅

这是我官方对freeCodeCamp JS问题的解决方案:

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) {

  for(let i = 0; i<contacts.length;i++){
    if(contacts[i].firstName == name && contacts[i].hasOwnProperty(prop)){
        return contacts[i][prop];
      }
      else {
        return "No such property"
      } 
    }
  return "No such contact";
}

console.log(lookUpProfile("Kristian", "lastName")); //Output: No such property

这是在 'nested-if' 循环中进行更改的官方解决方案:

function lookUpProfile(name, prop) {

  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";
}

console.log(lookUpProfile("Kristian", "lastName")); //Output: Vos

为什么官方的nested-if的逻辑和我的很相似,但我得到的却不一样?

它们在逻辑上并不相同。

他们的是这样的:

for (/*...*/) {
    if (a) {
        if (b) {
            return X;
        } else {
            return Y;
        }
    }
}

请注意,如果 a 不为真,则 return 都不会发生,并且循环会继续进行下一次迭代。

但是你的是:

for (/*...*/) {
    if (a && b) {
        return X;
    } else {
        return Y;
    }
}

即使 a 为假,它 returns 也不会进入下一个循环迭代。

如果你想将外部测试与内部测试结合起来,那就是:

for (/*...*/) {
    if (a && b) {
        return X;
    } else if (a) { // <===
        return Y;
    }
}

但这不如原来的那么清楚,最终不必要地测试了 a 两次。