即使它们在逻辑上相同,为什么我得到不同的输出?
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
两次。
第一次在这里提问,如有重复请见谅
这是我官方对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
两次。