Acesso à propriedade JavaScript: notação de ponto x colchetes?


394

Além do fato óbvio de que a primeira forma poderia usar uma variável e não apenas uma cadeia de caracteres literal, existe alguma razão para usar uma sobre a outra e, em caso afirmativo, em quais casos?

Em código:

// Given:
var foo = {'bar': 'baz'};

// Then
var x = foo['bar'];

// vs. 
var x = foo.bar;

Contexto: escrevi um gerador de código que produz essas expressões e estou me perguntando qual é preferível.


3
Apenas para inserir, não é uma resposta à sua pergunta original (já que você teve muitas boas explicações até agora), mas em termos de velocidade também não há diferença que valha a pena mencionar: jsperf.com/dot-vs-square-brackets . O teste acima fornece apenas uma margem de 2%, na melhor das hipóteses, para eles, pescoço e pescoço.
involuntário


Esta pergunta / resposta também pode ser usada para teclas UTF-8.
Peter Krauss

Respostas:


422

(Originado daqui .)

A notação de colchete permite o uso de caracteres que não podem ser usados ​​com a notação de ponto:

var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax

incluindo caracteres não ASCII (UTF-8), como em myForm["ダ"]( mais exemplos ).

Em segundo lugar, a notação entre colchetes é útil ao lidar com nomes de propriedades que variam de maneira previsível:

for (var i = 0; i < 10; i++) {
  someFunction(myForm["myControlNumber" + i]);
}

Arredondar para cima:

  • A notação de pontos é mais rápida de escrever e mais clara de ler.
  • A notação de colchete permite acesso a propriedades que contêm caracteres especiais e seleção de propriedades usando variáveis

Outro exemplo de caracteres que não podem ser usados ​​com notação de ponto são os nomes de propriedades que contêm um ponto .

Por exemplo, uma resposta JSON poderia conter uma propriedade chamada bar.Baz.

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax

45
Os exemplos de código e a redação do resumo parecem muito familiares. dev-archive.net/articles/js-dot-notation
Quentin

61
Não há necessidade de reinventar a roda, existe? Citando-o como uma referência.
Aron Rotteveel

13
Notação de ponto é mais rápido (pelo menos para mim) testar seu navegador jsperf.com/dot-notation-vs-bracket-notation/2
Dave Chen

4
em cromo 44 no meu suporte de máquina de notação é mais rápido
Austin France

2
@chenghuayang Quando você deseja acessar uma propriedade de um objeto cuja chave está armazenada em uma variável, não é possível com a notação de ponto.
Abdul

105

A notação de colchete permite acessar as propriedades pelo nome armazenado em uma variável:

var obj = { "abc" : "hello" };
var x = "abc";
var y = obj[x];
console.log(y); //output - hello

obj.x não funcionaria neste caso.


12

As duas maneiras mais comuns de acessar propriedades no JavaScript são com um ponto e entre colchetes. Ambos value.x and value[x]acessam uma propriedade em valor - mas não necessariamente a mesma propriedade. A diferença está em como x é interpretado. Ao usar um ponto, a parte após o ponto deve ser um nome de variável válido e nomeia diretamente a propriedade. Ao usar colchetes, a expressão entre colchetes é avaliada para obter o nome da propriedade. Enquanto value.x busca a propriedade do valor chamado “x”, o valor [x] tenta avaliar a expressão x e usa o resultado como o nome da propriedade.

Então, se você sabe que o imóvel em que você está interessado se chama “comprimento”, você diz value.length. Se você deseja extrair a propriedade nomeada pelo valor mantido na variável i, você diz value[i]. E porque os nomes de propriedade pode ser qualquer cadeia, se você quiser acessar uma propriedade chamada “2”ou “John Doe”, você deve usar colchetes: value[2] or value["John Doe"]. Esse é o caso mesmo que você saiba o nome exato da propriedade com antecedência, porque nenhum “2” nor “John Doe”é um nome de variável válido e, portanto, não pode ser acessado por meio de notação de ponto.

No caso de matrizes

Os elementos em uma matriz são armazenados em propriedades. Como os nomes dessas propriedades são números e geralmente precisamos obter o nome de uma variável, precisamos usar a sintaxe do colchete para acessá-los. A propriedade length de uma matriz nos diz quantos elementos ela contém. Esse nome de propriedade é um nome de variável válido e sabemos seu nome com antecedência; portanto, para encontrar o comprimento de uma matriz, você normalmente escreve array.lengthporque é mais fácil escrever do que array["length"].


Você poderia elaborar mais sobre array.length? Você diz que as propriedades acessadas pela notação de ponto não são avaliadas, portanto, no caso de array.length, não nos forneceria a string "length" em vez do valor avaliado; nesse caso, o número de itens na matriz? The elements in an array are stored in propertiesé isso que me confunde. O que você quer dizer com armazenado em propriedades? O que são propriedades? Na minha compreensão matriz é apenas um monte de valores sem propriedades. Se eles são armazenados em propriedades, como é que não é property: value/ array associativo?
Limpuls

Essa resposta é particularmente valiosa porque explica a diferença entre as duas notações.
Chessweb #

11

A notação de ponto não funciona com algumas palavras-chave (como newe class) no Internet Explorer 8.

Eu tinha esse código:

//app.users is a hash
app.users.new = {
  // some code
}

E isso aciona o temido "indentificador esperado" (pelo menos no IE8 no Windows XP, eu não tentei outros ambientes). A correção simples para isso é mudar para a notação de colchete:

app.users['new'] = {
  // some code
}

Resposta útil. Obrigado.
Ilyas karim #


8

Tenha cuidado ao usar estas notações: Por exemplo. se queremos acessar uma função presente no pai de uma janela. No IE:

window['parent']['func']

não é equivalente a

window.['parent.func']

Nós podemos usar:

window['parent']['func'] 

ou

window.parent.func 

para acessá-lo


6

De um modo geral, eles fazem o mesmo trabalho.
No entanto, a notação de colchete oferece a oportunidade de fazer coisas que você não pode fazer com a notação de ponto, como

var x = elem["foo[]"]; // can't do elem.foo[];

Isso pode ser estendido a qualquer propriedade que contenha caracteres especiais.


5

Você precisa usar colchetes se os nomes das propriedades tiverem caracteres especiais:

var foo = {
    "Hello, world!": true,
}
foo["Hello, world!"] = false;

Fora isso, suponho que seja apenas uma questão de gosto. IMHO, a notação de ponto é mais curta e torna mais óbvio que é uma propriedade e não um elemento de matriz (embora, é claro, o JavaScript não tenha matrizes associativas de qualquer maneira).



3

Você deve usar a notação de colchete quando -

  1. O nome da propriedade é número.

    var ob = {
      1: 'One',
      7 : 'Seven'
    }
    ob.7  // SyntaxError
    ob[7] // "Seven"
  2. O nome da propriedade possui um caractere especial.

    var ob = {
      'This is one': 1,
      'This is seven': 7,
    }  
    ob.'This is one'  // SyntaxError
    ob['This is one'] // 1
  3. O nome da propriedade é atribuído a uma variável e você deseja acessar o valor da propriedade por essa variável.

    var ob = {
      'One': 1,
      'Seven': 7,
    }
    
    var _Seven = 'Seven';
    ob._Seven  // undefined
    ob[_Seven] // 7

1

Caso em que a []notação é útil:

Se seu objeto é dinâmico e pode haver alguns valores aleatórios em chaves como numbere []ou qualquer outro caractere especial, por exemplo:

var a = { 1 : 3 };

Agora, se você tentar acessar como a.1será através de um erro, porque espera uma string por lá.


1

A notação de pontos é sempre preferível. Se você estiver usando algum editor de texto ou IDE "mais inteligente", ele mostrará nomes indefinidos desse objeto. Use a notação de colchetes apenas quando você tiver o nome com traços iguais ou algo semelhante inválido. E também se o nome estiver armazenado em uma variável.


E também há situações em que a notação de colchete não é permitida, mesmo que você não tenha traços. Por exemplo, você pode escrever Math.sqrt(25), mas não Math['sqrt'](25).
Sr. Lister

0

Deixe-me adicionar mais alguns casos de uso da notação entre colchetes. Se você deseja acessar uma propriedade, digamos x-proxyem um objeto, ela -será interpretada incorretamente. Existem outros casos também como espaço, ponto, etc., onde a operação de ponto não o ajudará. Além disso, se você tiver a chave em uma variável, a única maneira de acessar o valor da chave em um objeto é por meio de notação entre colchetes. Espero que você tenha um pouco mais de contexto.


0

Um exemplo em que a notação de ponto falha

json = { 
   "value:":4,
   'help"':2,
   "hello'":32,
   "data+":2,
   "😎":'😴',
   "a[]":[ 
      2,
      2
   ]
};

// correct
console.log(json['value:']);
console.log(json['help"']);
console.log(json["help\""]);
console.log(json['hello\'']);
console.log(json["hello'"]);
console.log(json["data+"]);
console.log(json["😎"]);
console.log(json["a[]"]);

// wrong
console.log(json.value:);
console.log(json.help");
console.log(json.hello');
console.log(json.data+);
console.log(json.😎);
console.log(json.a[]);

Os nomes das propriedades não devem interferir nas regras de sintaxe do javascript para que você possa acessá-las como json.property_name

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.