Acho que a resposta certa para a pergunta do Cheeso é que a implementação superou a documentação. Não requer mais uma string como chave, mas algo mais, que pode ser uma string (ou seja, entre aspas) ou (provavelmente) qualquer coisa que possa ser usada como um nome de variável, o que suponho que significa começar com uma letra _ , ou $, e inclui apenas letras, números e $ e _.
Eu queria simplificar o resto para a próxima pessoa que fizer essa pergunta com a mesma ideia que eu. Aqui está a carne:
Os nomes das variáveis não são interpolados em JSON quando usados como uma chave de objeto (Obrigado, Friedo!)
Breton, usando "identificador" em vez de "chave", escreveu que "se um identificador for uma palavra reservada, será interpretado como essa palavra e não como um identificador". Pode ser verdade, mas tentei sem problemas:
var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7};
a.break
=> 6
Sobre o uso de aspas, Quentin escreveu "... mas você não precisa, a menos que [a chave] contenha certos caracteres (ou combinações de caracteres que a tornariam uma palavra-chave)"
Descobri que a parte anterior (certos caracteres) é verdadeira, usando o sinal @ (na verdade, acho que $ e _ são os únicos caracteres que não causam o erro):
var a = {a@b:1};
=> Erro de sintaxe
var a = {"a@b":1};
a['a@b']
=> 1
mas o parênteses sobre palavras-chave, como mostrei acima, não é verdade.
O que eu queria funciona porque o texto entre a abertura {e os dois-pontos, ou entre a vírgula e os dois-pontos para as propriedades subsequentes é usado como uma string sem aspas para fazer uma chave de objeto ou, como Friedo colocou, um nome de variável não ' para ser interpolado:
var uid = getUID();
var token = getToken(); // Returns ABC123
var data = {uid:uid,token:token};
data.token
=> ABC123