Acessando propriedades no JavaScript
O mundo não pode parar. E o mundo parou.
Ailton Krenak – O amanhã não está à venda
Existem duas formas de acessar uma propriedade no JavaScript: por meio de um ponto ou com colchetes. No código abaixo é demonstrado como isso é feito acessando a propriedade de um object.
let homer = {
nome: 'Homer'
}
homer.nome // Homer
homer['nome'] // Homer
A notação com ponto possui uma regra, ela só pode ser usada se o nome da propriedade seguir as mesmas regras que são utilizadas quando declaramos uma variável. Ou seja, o nome da propriedade precisa começar com uma letra, underline (_), ou cifrão ($); e os demais caracteres pode ser também números. Quando o nome da propriedade não seguir essas regras, é preciso utilizar a notação com colchetes.
Vamos adicionar a propriedade “nome completo” ao nosso object. Note que o nome da nossa nova propriedade possui um espaço. Isso impossibilita o uso da notação com ponto.
let homer = {
nome: 'Homer',
'nome completo': 'Homer Simpson'
}
homer['nome completo'] // Homer Simpson
homer.nome completo // Não funciona
homer."nome completo" // Não funciona
Também não é possível usar a notação com ponto se o nome da propriedade for um número. Por exemplo, não é possível acessar a propriedade com nome “1” dessa forma: homer.1
. Nesse caso, temos que usar a notação de colchetes: homer[1]
. Isso explica o motivo da gente acessar os valores de um array referenciando o índice entre colchetes. Os índices de um array são propriedades de um object.
No JavaScript, encontramos propriedades em quase todos os tipos de valores. Por exemplo, uma string possui a propriedade length (armazena o tamanho da string) e o object Math possui a propriedade PI (armazena o valor aproximado de PI). Entretanto existem duas exceções que são o null e o undefined. Se você tentar acessar qualquer propriedade destes, será gerado um erro.
null.nome // TypeError: Cannot read property 'nome' of null
undefined['nome'] // TypeError: Cannot read property 'nome' of undefined
Esse é um erro muito comum. As vezes tentamos acessar uma propriedade de um objeto que não existe ou que ainda não possui um valor ou não possui a estrutura que a gente espera. Por exemplo, supondo que a variável “marge” foi declarada e nenhum valor foi atribuído a ela, ao tentar acessar a propriedade “nome” um erro do mesmo tipo será gerado. Uma forma de não gerar um erro e interromper a execução do programa é verificar se a variável possui algum valor antes de acessar a propriedade. Isso pode ser feito com o operador && (E lógico).
let marge;
marge.nome // TypeError: Cannot read property 'nome' of undefined
marge && marge.nome // retorna undefined, mas não gera um erro e o programa continua
Foi proposto um outro operador para ser usado nessa situação que é o ?. (optional chaining). Este operador verifica se o valor não é null ou undefined antes de prosseguir para o próximo nível do object.
let marge;
marge?.nome // undefined (sem gerar um erro)
marge?.['nome'] // undefined (sem gerar um erro)
Apesar de estar implementado na maioria dos navegadores modernos, o seu funcionamento pode não ser estável. Assim, é preciso ter atenção no seu uso.
Bibliotecas para acessar propriedades
O uso do operador && faz com que seja necessário verificar cada nível até chegar na propriedade desejada:
let marge;
marge && marge.filhos && marge.filhos.bart && marge.filhos.bart.idade
Podemos evitar isso utilizando a função get do Lodash ou prop (para um nível) e path do Ramda.
import * as Lodash from 'lodash';
import * as Ramda from 'ramda';
let marge;
Lodash.get(marge, 'filhos.bart.idade')
Ramda.prop('filhos', marge);
Ramda.path(['filhos', 'bart', 'idade'], marge);