2010-08-31 19 views
15

ho bumbed in uno di quei momenti in cui ho solo perdere la messa a fuoco e iniziare a chiedersi su una domanda stupida:Qual è il tipo di "chiavi" in JavaScript?

var a = { 
    b: "value" 
} 

Qual è il typeof 'b' e non significa che il "valore" typeof, ma la chiave effettiva etichettata come b?

sfondo: ho iniziato a chiedersi a questo quando ho dovuto creare una chiave che è una stringa:

var a = { 
    "b": "value" 
} 

perché in un momento successivo si fa riferimento come:

a["b"] 

E poi accolto chiedendo la domanda originale.

risposta

18

In termini letterali oggetto, b è una struttura. Le proprietà sono stringhe in JavaScript, sebbene quando si definisce il nome della proprietà all'interno di un oggetto letterale è possibile omettere i delimitatori di stringa.

Quando scorrendo i nomi delle proprietà utilizzando un for...in, il nome della proprietà è una stringa:

for (key in a) { 
    alert(typeof key); 
    //-> "string" 
} 
+0

Bene, ora ho iniziato a chiedermi se 'chiave' è una stringa solo quando si eseguono il ciclo delle chiavi in ​​un? - ma suppongo che dipenda dall'implementazione del motore javascript. – tunylund

+0

@tunylund: nessuna chiave è sempre una stringa. Ho dato alcuni esempi nella mia risposta di seguito :) –

+1

@tunylund: Come ha detto @Daniel, la chiave è sempre una stringa. Poiché non esiste un vero caso d'uso per testare il tipo di chiave di un oggetto (non il valore della chiave), e non c'è modo di farlo al di fuori dell'enumerazione delle chiavi con un ciclo come questo, non è qualcosa di cui dovresti preoccuparti :) –

2

b è una stringa, è solo una sintassi ridotta, in modo da scrivere

var a = { 
    b: "value" 
} 

invece di

var a = { 
    "b": "value" 
} 
2

Tenete a mente che gli oggetti JavaScript sono tabelle hash e le chiavi sono solo stringhe. È possibile omettere le virgolette sui nomi delle proprietà durante la dichiarazione, ma se si utilizzano parole riservate per i nomi di proprietà o qualsiasi altro nome che si verifica essere un identificatore non valido, ad esempio iniziare con una cifra o contenere spazi, è necessario avvolgere la proprietà nomi tra virgolette:

var a = { 
    "1b":  "value", 
    "b and c": "value", 
    "+12345": "value" 
}; 

si noti inoltre che è possibile fare riferimento le proprietà degli oggetti utilizzando la notazione punto o la notazione pedice indipendentemente dal fatto che le citazioni in cui utilizzate quando sono stati dichiarati. Tuttavia, se si utilizzano nomi di proprietà che sarebbero identificatori non validi, come quelli nell'esempio di cui sopra, si è costretti a usare la notazione pedice:

a.1b    // invalid (dot notation) 
a["b and c"]; // valid (subscript notation) 
+0

Questi identificatori non validi funzionano su tutti i (principali) browser? Non rischi di generare un'eccezione in alcuni motori JavaScript? –

+1

@ Marcel: la notazione del pedice è definita dalla specifica ECMA-262 e ogni stringa è valida. –

+0

@Marcel: Sì, dovrebbero funzionare in tutti i browser. Gli oggetti sono tabelle hash e accettano qualsiasi stringa come chiave (nome della proprietà). Douglas Crockford descrive l'argomento qui (sezione Oggetti): http://www.crockford.com/javascript/survey.html –

8

nomi delle proprietà sono costretti automaticamente in una stringa. Puoi provare tu stesso utilizzando un valore letterale numerico come nome di una proprietà.

var object = { 
    .12e3: 'wut' 
}; 
object[.12e3]; // 'wut' 
object['.12e3']; // undefined 
object['120']; // 'wut' 

// Let’s try another numeric literal: 
object = { 
    12e34: 'heh' 
}; 
object[12e34]; // 'heh' 
object['12e34']; // undefined 
object[1.2e35]; // 'heh' 
object['1.2e35']; // undefined 
object[1.2e+35]; // 'heh' 
object['1.2e+35']; // 'heh' 

Per questo motivo, si consiglia di utilizzare solo valori letterali stringa per i nomi di proprietà.

Da Unquoted property names/object keys in JavaScript, il mio write-up sul tema:

Citazioni possono essere omessi solo se il nome della proprietà è un valore letterale numerico o a valid identifier name.

[...]

Staffa notazione può tranquillamente essere utilizzato per tutti i nomi di proprietà.

[...]

Dot notazione può solo essere utilizzato quando il nome della proprietà è un nome identificativo valido.

Ho anche creato uno strumento che ti dirà se è possibile utilizzare qualsiasi nome di proprietà dato senza virgolette e/o con notazione dot. Provalo a mothereff.in/js-properties.

Screenshot

0

var a = {$ : 'hello', 2123 : 'number'}; 
 
for(var key in a) { 
 
    console.log(typeof key) 
 
}

chiavi in ​​javascript oggetti possono essere stringhe e simboli. il simbolo è un tipo di dati primitivo in javascript.

Problemi correlati