Cosa fa una virgola nelle espressioni JavaScript?


89

Se uso:

1.09 * 1; // returns "1.09"

Ma se uso:

1,09 * 1; // returns "9"

So che 1,09 non è un numero.

Cosa fa la virgola nell'ultimo pezzo di codice?

Altri esempi

if (0,9) alert("ok"); // alert
if (9,0) alert("ok"); // don't alert

alert(1); alert(2); alert(3); // 3 alerts
alert(1), alert(2), alert(3); // 3 alerts too

alert("2",
    foo = function (param) {
        alert(param)
    },
    foo('1')
)
foo('3'); // alerts 1, 2 and 3

1
Sono sorpreso che 09 non stia fallendo per "9" illegale in letterale ottale.
ricorsivo

7
@recursive: qualsiasi 9 nella rappresentazione ottale produce un fallback al decimale.
Yuval Adam

Non confondere la virgola in un elenco di argomenti. alertaccetta solo un argomento. Qualunque cosa dopo viene scartata.
Andrew

@Andrew: sì, viene scartato da alert (), che richiede solo un argomento, ma verrà eseguito! Quello è strano. Grazie.
Topera

1
@ Opera: non proprio strano se ci pensi dal punto di vista di JS. In JS non è necessario specificare l'elenco degli argomenti nella dichiarazione della funzione (è possibile utilizzare argumentsinvece l' oggetto, che può essere di qualsiasi lunghezza). Anche con il moderno JS compilato, non ci sarebbe modo di dire in anticipo quanti argomenti richiederebbe una funzione. Considera questo: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;l'interprete dovrebbe sapere come viene utilizzata la funzione per sapere quanti argomenti ci vorranno. Invece, valuta tutto.
Andrew

Risposte:


95

L'operatore virgola valuta entrambi i suoi operandi (da sinistra a destra) e restituisce il valore del secondo operando.

Fonte: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Ad esempio, l'espressione 1,2,3,4,5restituisce 5. Ovviamente l'operatore virgola è utile solo per operazioni con effetti collaterali.

console.log(1,2,3,4,5);
console.log((1,2,3,4,5));


2
L'hanno preso da C. Penso che sia utile solo per espressioni che hanno effetti collaterali.
Radomir Dopieralski

3
Non riesco a pensare a molti casi in cui l'operatore virgola viene utilizzato per influire ma salvare caratteri (minimizzare) o offuscare il codice.
user17753

1
@ user17753 può essere utilizzato legittimamente nella sezione separata da punto e virgola di un forciclo.
Cyoce

1
@Cyoce: Anche se questo è vero, parlando in generale tale logica viene eseguita più chiaramente nel corpo del ciclo. Alcune persone affermeranno che la loro strada consente più continuepunti senza duplicazioni, ma in tal caso non dovresti avere più continuepunti.
Gare di leggerezza in orbita

@ user17753 Sei sui soldi; cercare di capire un piccolo frammento di codice minimizzato è il motivo per cui sono qui
Raramente "Dov'è Monica" ha bisogno del

6

Qualche altro da considerare:

console.log((0, 9));
console.log((9, 0));
console.log(("foo", "bar"));


7
Lol, è divertente:alert("1", alert("2", alert("3")))
Topera

1
@ Andrew: Oops, ho aggiornato la mia risposta con quello che intendevo usare.
Douglas

L'operatore virgola valuta ciascuno dei suoi operandi (da sinistra a destra) e restituisce il valore lastdell'operando.
xgqfrms

2
L'operatore virgola valuta entrambi i suoi operandi (da sinistra a destra) e restituisce il valore second dell'operando.

https://stackoverflow.com/a/3561056/5934465

Dovrebbe essere così!

L'operatore virgola valuta ciascuno dei suoi operandi (da sinistra a destra) e restituisce il valore lastdell'operando.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator


5
L'operatore virgola accetta due operandi, quindi la citazione originale era corretta. Ciò di cui stai parlando è il risultato finale della nidificazione di tali espressioni, ma significa che la tua citazione sostitutiva è sottilmente sbagliata. a,b,c,dè((((a),b),c),d)
Gare di leggerezza in orbita

1

Dai un'occhiata qui : la virgola sta per più espressioni / dichiarazioni. Ad esempio nel tuo codice potresti usare una riga come questa:

var a=0, b=0, c=0;

Questo dichiarerebbe tutte e tre le variabili senza scrivere:

var a=0;
var b=0;
var c=0;

Spero che aiuti.


23
È un po 'vecchio, ma è importante notare: (1) l'esempio che hai fornito non usa l'operatore virgola (le vardichiarazioni non usano l' operatore virgola , anche se è una virgola) e (2) non puoi separare dichiarazioni utilizzando gli operatori virgola; sono consentite solo espressioni.
Qantas 94 Heavy

0

Aggiungere / modificare proprietà a un oggetto e restituirlo nella stessa riga è un possibile caso d'uso:

console.log(
  ((x) => (o = {biggerCond: r => r >= x},
           o.r5 = Array.from(window.crypto.getRandomValues(new Uint16Array(5))),
           o.isAnyBigger = o.r5.some(o.biggerCond),
           o.bigger = o.isAnyBigger ? o.r5.filter(o.biggerCond) : [x], o )
  )(5e4)
);
// Example
// {
//   bigger: [58414, 56500, 63397],
//   isAnyBigger: true,
//   isBiggerCond: r => r >= x,
//   r5: [58414, 12015, 56500, 63397, 43861]
// }

La funzione anonima sopra restituisce un oggetto con valori casuali più grandi del valore di input o, se non ce n'è nessuno, con il valore di input stesso in un array contenuto nella biggerproprietà.

È ancora zucchero sintattico (come le funzioni delle frecce ), ma abbrevia il numero di righe ... Mi chiedo se alcuni minificatori JS rilevano e regolano il codice in modo simile automaticamente. Eseguilo nella tua console:

((x)=>(o={biggerCond:r=>r>=x},o.r5=Array.from(window.crypto.getRandomValues(new Uint16Array(5))),o.isAnyBigger=o.r5.some(o.biggerCond),o.bigger=o.isAnyBigger?o.r5.filter(o.biggerCond):[x],o))(5e4)

2
Ma ovviamente non inseriresti questi incantesimi criptici nel codice di produzione, giusto?
Gare di leggerezza in orbita

@LightnessRacesinOrbit bene, dirò che dipende dallo scopo (ad esempio insegnamento, codice di abbreviazione, nessuna dichiarazione di variabile / funzione, ecc.) Se lo indenti come ho fatto sopra, è perfettamente leggibile ... Non riesco a smettere di notare che hai usato la parola "criptico" :)
CPHPython

1
Eh, non era nemmeno intenzionale 😂
Gare di leggerezza in orbita
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.