2012-01-09 14 views
5

simplemente me he dado cuenta de que puedo hacer lo siguiente en javascript ...Uso de dos puntos en javascript nombres de variables (por ejemplo, un:. B: c)

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

no puedo hacer ... Sin embargo

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

No esperaba que esta sintaxis funcionara bajo ninguna circunstancia. ¿Alguien tiene alguna idea de lo que está pasando cuando utilizo con éxito la notación 'a: b = x'?

+0

Eso es peculiar. Incluso puede leer nuevamente el valor, lo que realmente no esperaba. –

+0

'd ==" días felices "' –

+1

'a: b: c: d =" días felices ";' asigna ''días felices'' a' d'. no a 'a: b: c: d' .. –

Respuesta

4

Citando el estándar ECMAScript: “Una declaración puede ser prefijado por una etiqueta. Las declaraciones etiquetadas solo se usan junto con las declaraciones etiquetadas break y continue. "Una etiqueta consta de un identificador y dos puntos. Por lo tanto, a:b:c:d = "happy days"; es solo una declaración de asignación d = "happy days"; con el prefijo de tres etiquetas, que no tienen ningún efecto como tal.

14

Un colon en ECMAscript está allí por tres razones

  • que separan las claves de objetos a partir de sus valores declaraciones
  • línea condicionales
  • etiquetado

que este último descubierto. Lo que básicamente está haciendo es crear una etiqueta llamada a, luego b, luego c y finalmente está asignando un valor a una variable global d. Así que después de

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

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

uso más común de esto es dentro de una sentencia switch dónde lo hacemos como

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

Pero también se puede directamente "objetivo" una etiqueta con la declaración continue. Esto resulta muy cerca de goto en muchos otros idiomas y se parece a

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

Acepto que estas son etiquetas, pero creo que "caso x:" es un uso alternativo de los dos puntos, ya que las etiquetas parecen servir estrictamente como puntos de referencia para declaraciones break y continue, no para cambiar instrucciones. Además, si desea estar completo, los dos puntos también se usan en las instrucciones de cambio en línea (a? B: c;). –

+0

@ skier88: sí, tienes razón, olvidaste los condicionales en línea. Para el 'switch/case', siempre pensé que un caso casi se trata como una etiqueta, pero voy a echar un vistazo. – jAndy

Cuestiones relacionadas