Dúvida sobre assessores de propriedades no JavaScript

Bom dia. Eu quero mostrar no console todas as propriedades e valores de todos os livros dentro desse array que eu criei, no formato “[PROPRIEDADE]: [VALOR]”. Então fiz o seguinte código, que funciona perfeitamente:

Porém, na linha 9 do console.log, quando tentei colocar books[i].prop em vez de books[i][prop], eu não consegui fazer isso, porque os valores das propriedades foram exibidos como undefined. Alguém poderia me explicar por que isso ocorre?

Se você fizer algo como

for(var i = 0; i < books.length;i++) {
     for(var props in books[i]) {
         console.log(props);
         //continua código normal aqui
     }
}

Você verá, a cada iteração, uma saída parecida com isso

 0
 1
 0
 1

E assim por diante.
Isso ocorre por uma simples razão, ao fazer for, você não pega o nome do atributo, mas, seu índice, começando em 0.
Se quiser acessar o atributo, terá de fazer isso de maneira explícita

books[i].name;
books[i].pages;

Entendeu?