Respostas:
Não, as aspas não fazem diferença (a menos que, como você observou, você queira usar uma chave que não seja um identificador JavaScript válido).
Como uma nota lateral, o formato de troca de dados JSON faz requer aspas em torno identificadores (e que não permitem que as aspas simples).
Em Nomes de propriedades não citados / chaves de objeto em JavaScript , minha redação sobre o assunto:
As cotações só podem ser omitidas se o nome da propriedade for um literal numérico ou um nome de identificador válido .
[...]
A notação de colchete pode ser usada com segurança para todos os nomes de propriedades.
[...]
A notação de ponto pode ser usada apenas quando o nome da propriedade é um nome de identificador válido.
Observe que palavras reservadas podem ser usadas como nomes de propriedades não citadas no ES5. No entanto, para compatibilidade retroativa com o ES3, sugiro citá-los de qualquer maneira.
Também criei uma ferramenta que informa se qualquer nome de propriedade pode ser usado sem aspas e / ou com notação de ponto. Experimente em mothereff.in/js-properties .
Não há diferença aqui. Apenas uma questão de estilo. Uma das razões para fazer isso é poder usar 'super' ou 'classe' como chave, pois são palavras-chave reservadas.
Algumas pessoas podem ficar tentadas a passar uma cadeia de caracteres com espaço em branco e então chamar o ['I can have white space']. Mas eu chamaria isso de má prática.
Não, não para javascript. No entanto, alguns analisadores JSON falharão quando as aspas ao redor das chaves não estiverem presentes.
Existem algumas situações em que são diferentes. Por exemplo, se você estiver usando o jQuery e estiver fazendo uma lista de parâmetros a serem transmitidos ao chamar o comando jQuery $ () para criar um elemento, as palavras entre aspas serão transformadas em parâmetros e as palavras não entre aspas serão transformadas em funções. Por exemplo, "size" definirá o atributo size do objeto e size (sem aspas) chamará a função size () no objeto. Veja jQuery () , na parte inferior:
Embora o segundo argumento seja conveniente, sua flexibilidade pode levar a consequências não intencionais (por exemplo, $ ("
<input>", {size: "4"}) chamando o método .size () em vez de definir o atributo size). O bloco de código anterior poderia, portanto, ser escrito como:
obj = { 12e34: true };não é o mesmo queobj = { '12e34': true };. O primeiro exigiria o acesso à propriedadeobj['1.2e+35'], enquanto o último você usariaobj['12e34']. Veja minha resposta para mais detalhes.