Почему console.logging вне функции работает так, как задумано, но внутри нее мое значение помечается как неопределенное?

avatar
santti_alter
9 августа 2021 в 07:13
166
3
0

Я выполнял задание по кодированию от freecodecamp.org. Вот он:

//create a function where you pass a name and a property, and the value of the prop will be returned

var 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 (var i = 0; i < contacts.length; i++) {
        
        if (name == contacts[i].firstName) {
            
            return console.log(contacts[i][prop]) || console.log('No such property'); 
            
             }
         } 
         
    return console.log('No such contact');
}

lookUpProfile("Akira", "likes");

Моя проблема в том, что вместо console.log самой функции я хотел сделать это внутри функции, чтобы значения были строками. Однако это продолжало помечать undefined, и я не понимаю, почему. Вот правильная форма кода

//create a function where you pass a name and a property, and the value of the prop will be returned

var 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 (var i = 0; i < contacts.length; i++) {
        
        if (name == contacts[i].firstName) {
            
            return contacts[i][prop] || 'No such property'; 
            
             }
         } 
         
    return console.log('No such contact');
}

console.log(lookUpProfile("Akira", "likes"));

Кроме того, я не понимаю, как оператор "или" (||) работает как оператор "иначе" и почему последний возврат возвращает значение только в том случае, если оператор if ложен. Кто-нибудь может мне помочь?

Источник

Ответы (3)

avatar
Oliver Ilmjärv
9 августа 2021 в 07:19
2

Не возвращайте console.log, поскольку функция console.log ничего не возвращает, поэтому она возвращает неопределенное значение. Функция Console.log никогда не используется для возврата.

Использовать журнал консоли перед возвратом и по-прежнему возвращать значение после регистрации.

const func = () => {
    const myValue = 10;

    console.log(myValue);
    return myValue;
}
santti_alter
9 августа 2021 в 07:22
0

Спасибо. Кроме того, почему он ничего не возвращает?

Oliver Ilmjärv
9 августа 2021 в 07:24
0

@santti_alter Целью этого является вывод чего-либо на консоль, поскольку он не мутирует и ничего не делает с вставленным значением, нет смысла что-либо возвращать. Он предназначен только для целей разработки и не рекомендуется для использования в реальном производстве.

avatar
TechySharnav
9 августа 2021 в 07:40
0

console.log возвращает undefined, потому что на самом деле ничего не возвращает. Его основная цель — что-то напечатать. Поэтому не рекомендуется использовать return с console.log.

.

Операция || OR сначала вычисляет 1-е выражение, а затем, в зависимости от него, вычисляет 2-е выражение.
Например, exp1 || exp2 вернет exp1, если значение exp1 равно true, в противном случае будет возвращено exp2.

var 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 (var i = 0; i < contacts.length; i++) {

    if (name == contacts[i].firstName) {
      return contacts[i][prop] || 'No such prop';
    }
  }

  return 'No such contact';

}

console.log(lookUpProfile("Akira", "likes"));
console.log(lookUpProfile("Akira", "dislikes"));
console.log(lookUpProfile("Sharnav", "likes"));
TechySharnav
9 августа 2021 в 09:32
0

@santti_alter Надеюсь, это поможет

avatar
Arash Etemad
9 августа 2021 в 07:19
0

console.log() всегда возвращает undefined, сделайте так:

function lookUpProfile(name, prop) {

    for (var i = 0; i < contacts.length; i++) {
    
        if (name == contacts[i].firstName) {
        
            return contacts[i][prop]; 
        
        }
    } 
     
    return null;
}

console.log( lookUpProfile("Akira", "likes") ?? 'No such contact');
see sharper
9 августа 2021 в 23:30
0

Может быть потому, что из-за отступа кажется, что вы неправильно поняли логику. Похоже, что возвращаемый нуль находится внутри цикла for.

Arash Etemad
10 августа 2021 в 18:46
0

@seesharper Такой хороший момент! 😅 спасибо дружище