Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[JavaScript: Conhecendo Objetos] [Módulo: 03 - Percorrendo Objetos]

Olá pessoal, tudo bem?

Acho que tem um pequeno erro no exemplo que a professora Ju colocou sobre o tratamento dos parâmetros cujos valores não são strings pro JS.

Na condicional ela coloca como "e", quando na verdade deveria ser "ou" para a verificação de se o objeto é um tipo "object" ou "function", neste caso, visto que o mesmo parâmetro não pode ser de dois tipos simultaneamente, o código nunca iria cair nessa condição.

O trecho é o seguinte.

// código omitido

for (let chave in estudante) {
    const tipo = typeof estudante[chave];
    if (tipo !== 'object' && tipo !== 'function')
        const texto = `a chave ${chave} tem o valor ${estudante[chave]}`
        console.log(texto);
}

No meu teste eu fiz alguns outros ajustes, mas também considerei como uma condição de "e":

//criando um objeto com um outro objeto como parâmetro
const objetoComObjetoDentro = {
    tipo: 'hobbit',
    nome: 'frodo',
    categoria: 'bolseiro',
    filme: 'senhor dos aneis',
    // objeto como parametro:
    ranqueadores: [{
        nome: 'imdb',
        notaCritica: 8,
        notaPublico: 9.5,
        disponibilidade: 'Amazon Prime',
    },
    {
        nome: 'rotten tomatoes',
        notaCritica: 8.1,
        notaPublico: 9.8,
        disponibilidade: 'Netfix'
    }]

}

// quando existem objetos como parâmetros, o JS não lista pois ele só faz a iteração com strings. 
// neste caso é necessário colocar uma condição para tratar somente as saídas que são vistas como strings
for (atributos in  objetoComObjetoDentro){
    //condição para verificar se o parâmetro é um objeto ou uma função e envia mensagem de alerta
    if (typeof(objetoComObjetoDentro[atributos]) == 'object' || typeof(objetoComObjetoDentro[atributos]) == 'function'){
        console.log(`O atributo ${atributos} é do tipo ${typeof(objetoComObjetoDentro[atributos])}`)
    }
    //caso o Parâmetro não seja um objeto ou uma função, ele faz a listagem
    else{
        console.log(`Atributo: ${atributos} \n  Valor:  ${objetoComObjetoDentro[atributos]} \n `)
    }

}

Minha análise está correta?

Valeu!!

1 resposta
solução!

Olá Rafael, tudo bem?

Sua análise está correta! No exemplo fornecido pela professora, realmente seria mais apropriado utilizar o operador "ou" (||) em vez de "e" (&&) na condicional, pois um valor não pode ser simultaneamente de dois tipos diferentes.

Aqui está uma versão corrigida do código da professora Ju:

for (let chave in estudante) {
    const tipo = typeof estudante[chave];
    if (tipo !== 'object' && tipo !== 'function') {
        const texto = `a chave ${chave} tem o valor ${estudante[chave]}`;
        console.log(texto);
    }
}

E aqui está o seu exemplo, que também está correto:

for (let atributos in objetoComObjetoDentro) {
    if (typeof(objetoComObjetoDentro[atributos]) == 'object' || typeof(objetoComObjetoDentro[atributos]) == 'function') {
        console.log(`O atributo ${atributos} é do tipo ${typeof(objetoComObjetoDentro[atributos])}`);
    } else {
        console.log(`Atributo: ${atributos} \n  Valor:  ${objetoComObjetoDentro[atributos]} \n `);
    }
}

Como você mencionou, ao usar o operador "ou" (||), o código verifica corretamente se o tipo do atributo é object ou function, e então decide se deve exibir uma mensagem de alerta ou listar o valor. Muito bom! Boa percepção. Eu vou encaminhar para o time de conteúdo para eles analisarem e corrigirem.

Muito obrigado pelo feedback. Continue ajudando a comunidade Alura! :)

Espero ter ajudado e bons estudos!