2012-01-09 10 views
5

ho appena notato che posso fare quanto segue in javascript ...Utilizzo di due punti in javascript nomi delle variabili (ad esempio un:. B: c)

a:b:c:d = "happy days"; 
a:b:c = function(text){alert(text);}; 

Non posso tuttavia fare ...

var a:b:c:d = "happy days"; 
// or 
var myObj = {prop:a:b:c:d}; 

Non mi aspettavo che questa sintassi funzionasse in nessuna circostanza. Qualcuno ha idea di cosa sta succedendo quando uso correttamente la notazione 'a: b = x'?

+0

Questo è strano, cioè. Puoi persino leggere di nuovo il valore, cosa che non mi aspettavo. –

+0

'd ==" giorni felici "' –

+1

'a: b: c: d =" giorni felici ";' assegna ''giorni felici'' a' d'. non a 'a: b: c: d' .. –

risposta

4

Citando lo standard ECMAScript: “Una dichiarazione può essere preceduto da un'etichetta. Le dichiarazioni etichettate vengono utilizzate solo in combinazione con le dichiarazioni con etichetta break e continue. "Un'etichetta è composta da un identificatore e due punti. Quindi a:b:c:d = "happy days"; è solo una dichiarazione di assegnazione d = "happy days"; preceduta da tre etichette, che non hanno alcun effetto in quanto tale.

14

Un colon in ECMAscript è lì per tre ragioni

  • separano chiavi oggetto dai suoi valori dichiarazioni
  • linea condizionali
  • etichettatura

si scoperto quest'ultimo. Quello che stai facendo in pratica è creare un'etichetta chiamata a, quindi b, quindi c e infine assegnare un valore a una variabile globale d. Così, dopo

a:b:c:d = "happy days"; 

console.log(a); // reference error 
console.log(d); // "happy days"; 

utilizzo più comuni per questo si trova a switch dichiarazione in cui lo facciamo come

switch(foo) { 
    case 0: break; 
    case 1: break; 
    // etc 
} 

Ma si può anche direttamente "target" un'etichetta con la dichiarazione continue. Che viene molto vicino a goto in molte altre lingue e si presenta come

foobar: 
for(var i = 0; i < 10; i++) { 
    for(var j = 0; j < 10; j++) { 
     if(j === 2) 
      continue foobar; 
    } 
} 
+2

Concordo sul fatto che si tratti di etichette, ma penso che "case x:" sia un uso alternativo del colon, poiché le etichette sembrano servire strettamente come punti di riferimento per le dichiarazioni break e continue, non per le istruzioni switch. Inoltre, se vuoi essere completo, i due punti vengono anche usati nelle istruzioni switch inline (a? B: c;). –

+0

@ skier88: sì hai ragione, dimenticato di condizionali in linea. Per il 'switch/caso', ho sempre pensato che un caso è trattato quasi come un'etichetta, ma cercherò di farlo. – jAndy

Problemi correlati