Myślę, że właściwą odpowiedzią na pytanie Cheeso jest to, że implementacja przerosła dokumentację. Nie wymaga już łańcucha jako klucza, ale raczej coś innego, co może być ciągiem znaków (tj. W cudzysłowie) lub (prawdopodobnie) czymkolwiek, co może być użyte jako nazwa zmiennej, co, jak sądzę, oznacza rozpoczęcie od litery, _ lub $ i zawierają tylko litery, cyfry oraz znaki $ i _.
Resztę chciałem uprościć następnej osobie, która zadaje to pytanie z tym samym pomysłem, co ja. Oto mięso:
Nazwy zmiennych nie są interpolowane w formacie JSON, gdy są używane jako klucz obiektu (dzięki Friedo!)
Breton, używając „identyfikatora” zamiast „klucza”, napisał, że „jeśli okaże się, że identyfikator jest słowem zastrzeżonym, jest on interpretowany jako to słowo, a nie jako identyfikator”. Może to prawda, ale próbowałem bez problemu:
var a = {do:1,long:2,super:3,abstract:4,var:5,break:6,boolean:7};
a.break
=> 6
O używaniu cudzysłowów Quentin napisał „... ale nie musisz tego robić, chyba że [klucz] zawiera określone znaki (lub kombinacje znaków, które uczyniłyby z niego słowo kluczowe)”
Okazało się, że pierwsza część (niektóre znaki) jest prawdą, używając znaku @ (w rzeczywistości myślę, że $ i _ to jedyne znaki, które nie powodują błędu):
var a = {a@b:1};
=> Błąd składni
var a = {"a@b":1};
a['a@b']
=> 1
ale nawias dotyczący słów kluczowych, jak pokazałem powyżej, nie jest prawdziwy.
To, co chciałem, działa, ponieważ tekst między początkiem {a dwukropkiem lub między przecinkiem a dwukropkiem dla kolejnych właściwości jest używany jako niecytowany ciąg do utworzenia klucza obiektu lub, jak ujął to Friedo, nazwa zmiennej nie robi t zostanie interpolowany:
var uid = getUID();
var token = getToken();
var data = {uid:uid,token:token};
data.token
=> ABC123