2012-01-09 9 views
5

Właśnie zauważyłem, że mogę wykonać następujące czynności w javascript ...Korzystanie dwukropki w javascript nazwy zmiennych (np. B: c)

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

Nie mogę jednak zrobić ...

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

Nie spodziewałem się, że ta składnia zadziała w każdych okolicznościach. Czy ktokolwiek ma pojęcie, co się dzieje, gdy z powodzeniem używam notacji "a: b = x"?

+0

To dziwne, to znaczy. Możesz nawet odczytać wartość z powrotem, czego naprawdę nie oczekiwałem. –

+0

'd ==" szczęśliwe dni "' –

+1

'a: b: c: d =" szczęśliwe dni ";' przypisuje '' szczęśliwe dni'' do 'd'. nie do 'a: b: c: d' .. –

Odpowiedz

4

Cytowanie standardu ECMAScript: „Oświadczenie może być poprzedzony etykietą. Oznaczenia opatrzone etykietą są używane tylko w połączeniu ze znakowanymi instrukcjami break i continue. "Etykieta składa się z identyfikatora i dwukropka. Tak więc a:b:c:d = "happy days"; jest po prostu instrukcją przypisania d = "happy days"; z prefiksem z trzema etykietami, które nie mają żadnego efektu jako takiego.

14

dwukropkiem ECMAScript jest dla trzech powodów

  • oddzielających klawiszy obiektu z wartościami sprawozdań
  • rolki warunkowego
  • etykietowania

można discoverd ostatniego. To, co zasadniczo robisz, to tworzenie etykiety o nazwie a, następnie b, następnie c i ostatecznie przypisujesz wartość globalnej zmiennej d. Więc po

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

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

Najczęstsze wykorzystanie tego jest w switch oświadczenie w którym nie podoba

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

Ale można też bezpośrednio „target” etykieta ze stwierdzeniem continue. Że przychodzi bardzo blisko goto w wielu innych językach i wygląda

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

Zgadzam się, że to są etykiety, ale myślę, że "przypadek x:" to alternatywne użycie dwukropka, ponieważ etykiety wydają się służyć wyłącznie jako punkty odniesienia dla instrukcji break i continue, a nie instrukcji switch. Ponadto, jeśli chcesz być kompletny, dwukropek jest również używany w instrukcjach przełączania w linii (a? B: c;). –

+0

@ skier88: tak masz rację, zapomniałeś o inline conditionals. W przypadku 'switch/case' zawsze uważałem, że sprawa jest traktowana jak etykieta, ale będę musiał to sprawdzić. – jAndy

Powiązane problemy