Cosa fa ':' (due punti) in JavaScript?


178

Sto imparando JavaScript e mentre sfoglio la libreria jQuery vedo che i :due punti vengono usati molto. A cosa serve questo in JavaScript?

// Return an array of filtered elements (r)
// and the modified expression string (t)
   return { r: r, t: t };

Risposte:


247
var o = {
    r: 'some value',
    t: 'some other value'
};

è funzionalmente equivalente a

var o = new Object();
o.r = 'some value';
o.t = 'some other value';

14
Così simile alla sintassi dell'inizializzatore di oggetti C #. Grazie!
Michea

Cosa succede se non vi è alcun oggetto racchiuso?
theonlygusti,

@ FranciscI.B se dovessi indovinare, penso che sia TypeScript, che è un superset di JavaScript. Sta dichiarando una classe, con una var chiamata xMin, il cui tipo è un float. Abbastanza sur questo è ciò che significa.
Sal_Vader_808

96

Inoltre, i due punti possono essere utilizzati per etichettare un'istruzione. per esempio

var i = 100, j = 100;
outerloop:
while(i>0) {
  while(j>0) {
   j++

   if(j>50) {
     break outerloop;
   }
  }
i++

}

1
ETICHETTA A ((DICHIARAZIONE))
Muhammad Umer

4
Benvenuto in Spagetti Code :)
Leo The Four

Un goto non può essere mascherato: semplicemente rompi goto; e l'hai trovato! ;)
Andrew,

1
Pagina di riferimento MDN per l'etichetta JS: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Peter

sì, ecco perché a => {b: 2} non verrà lanciato e restituito indefinito
Pavlo D

70

Ragazzi, state dimenticando che il colon viene utilizzato anche nell'operatore ternario (anche se non so se jquery lo usi per questo scopo).

l'operatore ternario è una forma di espressione (le espressioni restituiscono un valore) di un'istruzione if / then. è usato così:

var result = (condition) ? (value1) : (value2) ;

Un operatore ternario potrebbe anche essere usato per produrre effetti collaterali proprio come se / allora, ma questa è una pratica profondamente negativa.


2
"Operatore ternario" dell'AKA. Si noti che l'OP chiede rigorosamente il caso letterale dell'oggetto. Se vogliamo andare oltre ciò che l'OP chiede, i due punti vengono utilizzati anche nelle etichette.
Ates Goral,

14
sì, intendevo questo. Dovrei semplicemente stare fuori da Internet, davvero, se ho intenzione di andare in giro a identificare erroneamente concetti di programmazione del genere.
Bretone,

Sarebbe fantastico vederlo usato per le etichette e quant'altro, quindi l'uso non è mai confuso @AtesGoral perché adesso sto ancora cercando su Google quelli.
Shane,

Forse sarebbe più facile elencare le cose che: non sono utilizzate in Javascript.
kingfrito_5005,

45

Fondamentalmente ":" è un delimitatore per le coppie chiave-valore. Nel tuo esempio è una notazione letterale di oggetti Javascript.

In JavaScript, gli oggetti sono definiti con i due punti che delimitano l'identificatore per la proprietà e il suo valore in modo da poter avere quanto segue:

return { 
    Property1 : 125,
    Property2 : "something",
    Method1 : function() { /* do nothing */ },
    array: [5, 3, 6, 7]
};

e poi usalo come:

var o =  { 
    property1 : 125,
    property2 : "something",
    method1 : function() { /* do nothing */ },
    array: [5, 3, 6, 7]
};

alert(o.property1); // Will display "125"

Un sottoinsieme di questo è anche noto come JSON (Javascript Object Notation), utile nelle chiamate AJAX perché è compatto e rapido da analizzare in lingue lato server e Javascript può facilmente serializzare una stringa JSON in un oggetto.

// The parenthesis '(' & ')' around the object are important here
var o = eval('(' + "{key: \"value\"}" + ')');

Puoi anche inserire la chiave tra virgolette se contiene una sorta di carattere o spazi speciali, ma non lo consiglierei perché rende le cose più difficili con cui lavorare.

Tieni presente che la notazione letterale di oggetti JavaScript nel linguaggio JavaScript è diversa dallo standard JSON per il passaggio dei messaggi. La differenza principale tra 2 è che funzioni e costruttori non fanno parte dello standard JSON , ma sono consentiti nei letterali degli oggetti JS.


2
Mentre leggevo la tua risposta, ho pensato di votarla, ma poi hai detto che "è anche noto come JSON". Letterali oggetto JSON e sono sicuramente non la stessa cosa, anzi i tuoi esempi, prima si parla JSON non sono validi JSON.
nnnnnn,

@nnnnnn Le differenze tra i 2 sono molto sottili, ma comunque importanti. Ho aggiornato la mia risposta per essere più specifico al riguardo.
Dan Herbert,

1
Vedo l'aggiornamento. Bello. Si noti che JSON richiede che i nomi delle chiavi siano tra virgolette.
nnnnnn,

Perché devi menzionarlo tutto due volte? Quando hai detto "e poi
usalo

17

Fa parte della sintassi letterale dell'oggetto. Il formato di base è:

var obj = { field_name: "field value", other_field: 42 };

Quindi puoi accedere a questi valori con:

obj.field_name; // -> "field value"
obj["field_name"]; // -> "field value"

Puoi anche avere funzioni come valori, in pratica ti danno i metodi dell'oggetto:

obj['func'] = function(a) { return 5 + a;};
obj.func(4);  // -> 9

1
Ottimo perché mi ha dato il termine per cercare e scoprire ulteriori informazioni.
johnny,

13

Può essere usato per elencare oggetti in una variabile. Inoltre, viene usato un po 'nella scorciatoia di una frase if:

var something = {face: 'hello',man: 'hey',go: 'sup'};

E chiamandolo così

alert(something.man);

Anche la frase if:

function something() {  
  (some) ? doathing() : dostuff(); // if some = true doathing();, else dostuff();
}

10

Non dimentichiamo l'istruzione switch, in cui i due punti vengono utilizzati dopo ogni "caso".


10

Questi sono generalmente gli scenari in cui i due punti ":" sono utilizzati in JavaScript

1- Dichiarazione e inizializzazione di un oggetto

var Car = {model:"2015", color:"blue"}; //car object with model and color properties

2- Impostazione di un'etichetta (sconsigliato poiché causa complicate strutture di controllo e codice Spaghetti)

List: 
while(counter < 50)
{
     userInput += userInput;
     counter++;
     if(userInput > 10000)
     {
          break List;
     }
}

3- In Switch Switch Statement

switch (new Date().getDay()) {
    case 6:
        text = "Today is Saturday";
        break; 
    case 0:
        text = "Today is Sunday";
        break; 
    default: 
        text = "Looking forward to the Weekend";
}

4- Operatore ternario

document.getElementById("demo").innerHTML = age>18? "True" : "False";

1
Un singolo punto può essere utilizzato anche per la valutazione del corto circuito al posto di ||. Esempio: var a = false, b = a || 'Default value';è equivalente avar a = false, b = a : 'Default value';
Shaun Cockerill il

7

Questa è JSON, o notazione oggetto JavaScript. È un modo rapido per descrivere un oggetto o una mappa hash. La cosa prima dei due punti è il nome della proprietà e la cosa dopo i due punti è il suo valore. Quindi, in questo esempio, c'è una proprietà "r", il cui valore è qualunque cosa sia nella variabile r. Lo stesso per t.


3
JSON è solo un sottoinsieme della sintassi di inizializzazione degli oggetti JavaScript. '{a: k ()}' dove k è una funzione non è JSON, ma è perfettamente sintassi di inizializzazione di oggetti JavaScript.
yfeldblum,

12
Per essere pedanti, no, non è "JSON". E sembra come JSON. È la sintassi letterale dell'oggetto nativa di JavaScript e che può apparire direttamente all'interno del codice. JSON invece è un formato di serializzazione / interscambio di dati. JSON è JSON solo quando è "disperso nell'aria", cioè in transito o quando non è ancora analizzato in un oggetto reale.
Ates Goral,

3
+1 per Ates Goral, ma nota che l'esempio fornito non assomiglia nemmeno a JSON: i nomi dovrebbero essere racchiusi tra virgolette perché sia ​​sintassi JSON valida.
NickFitz,

3

Uno stupido errore che ho fatto qualche tempo fa che potrebbe aiutare alcune persone.

Tieni presente che se stai utilizzando ":" in un evento come questo, il valore non cambierà

var ondrag = (function(event, ui) {
            ...

            nub0x: event.target.offsetLeft + event.target.clientWidth/2;
            nub0y = event.target.offsetTop + event.target.clientHeight/2;

            ...
        });

Quindi "nub0x" verrà inizializzato con il primo evento che si verifica e non cambierà mai il suo valore. Ma "nub0y" cambierà durante i prossimi eventi.


Mi sono imbattuto in questo, e in realtà quello che sta succedendo qui è che stai usando un'etichetta prima della tua dichiarazione. Non viene effettuata alcuna assegnazione, ma l'istruzione event.target.offsetLeft + event.target.clientWidth/2;viene eseguita ogni volta che viene chiamato il metodo ondrag, ma non assegnare mai il valore anub0x
kketch

In realtà questo viene usato come una valutazione e :viene trattato come se fosse un ||. Pertanto, event.target.offsetLeft + event.target.clientWidth/2;si attiverà solo ogni volta che fornito nub0xequivale a falso.
Shaun Cockerill,

1

Un altro uso dei due punti in JavaScript è di rinominare una variabile, ovvero:

const person = { 
    nickNameThatIUseOnStackOverflow: "schlingel",
    age: 30,
    firstName: "John"
};
const { nickNameThatIUseOnStackOverflow: nick } = person; // I take nickNameThatIUseOnStackOverflow but want to refer it as "nick" from now on.
nick = "schling";

Ciò è utile se si utilizza una libreria di terze parti che restituisce valori con nomi di variabili scomode / lunghe che si desidera rinominare nel codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.