¿Qué hace una coma en las expresiones de JavaScript?


89

Si uso:

1.09 * 1; // returns "1.09"

Pero si uso:

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

Sé que 1,09 no es un número.

¿Qué hace la coma en el último fragmento de código?

Más ejemplos

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
Me sorprende que 09 no esté fallando por el ilegal '9' en literal octal.
recursivo

7
@recursive: cualquier 9 en la representación octal da como resultado un retroceso a decimal.
Yuval Adam

No confunda la coma en una lista de argumentos. alerttoma solo un argumento. Cualquier cosa después de eso se descarta.
Andrew

@Andrew: sí, es descartado por alert (), que solo toma un argumento, ¡pero se ejecutará! Eso es raro. Gracias.
Topera

1
@Topera: no es realmente extraño si lo piensas desde la perspectiva de JS. En JS no tiene que especificar su lista de argumentos en su declaración de función (puede usar el argumentsobjeto en su lugar, que puede tener cualquier longitud). Incluso con JS compilado moderno, no habría forma de saber con anticipación cuántos argumentos tomaría una función. Considere esto: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;el intérprete tendría que saber cómo se estaba utilizando la función para saber cuántos argumentos se necesitarían. En cambio, evalúa todo.
Andrew

Respuestas:


95

El operador de coma evalúa ambos operandos (de izquierda a derecha) y devuelve el valor del segundo operando.

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

Por ejemplo, la expresión se 1,2,3,4,5evalúa como 5. Obviamente, el operador de coma es útil solo para operaciones con efectos secundarios.

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


2
Lo tomaron de C. Creo que solo es útil para expresiones que tienen efectos secundarios.
Radomir Dopieralski

3
No puedo pensar en muchos casos en los que el operador de coma se usa para ningún efecto, excepto para guardar caracteres (minificar) u ocultar código.
user17753

1
@ user17753 se puede usar legítimamente en la sección separada por punto y coma de un forbucle.
Cyoce

1
@Cyoce: Si bien eso es cierto, hablando en general, dicha lógica se realiza más claramente en el cuerpo del bucle. Algunas personas afirman que su camino permite múltiples continuepuntos sin duplicación, pero entonces no debería tener múltiples continuepuntos.
Lightness Races in Orbit

@ user17753 Estás en el dinero; tratando de entender un pequeño fragmento de código minified es por eso que estoy aquí
Pocas veces '¿Dónde está Monica' Needy

6

Algunos más para considerar:

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


7
Lol, es divertido:alert("1", alert("2", alert("3")))
Topera

1
@Andrew: Vaya, he actualizado mi respuesta con lo que quería usar.
Douglas

El operador de coma evalúa cada uno de sus operandos (de izquierda a derecha) y devuelve el valor del lastoperando.
xgqfrms

2
El operador de coma evalúa ambos operandos (de izquierda a derecha) y devuelve el valor del second operando.

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

¡Debería ser así!

El operador de coma evalúa cada uno de sus operandos (de izquierda a derecha) y devuelve el valor del lastoperando.

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


5
El operador de coma toma dos operandos, por lo que la cita original era correcta. De lo que está hablando es del resultado final de anidar tales expresiones, pero significa que su cita de reemplazo está sutilmente mal redactada. a,b,c,des((((a),b),c),d)
Lightness Races in Orbit

1

Eche un vistazo aquí : la coma representa múltiples expresiones / declaraciones. Por ejemplo, en su código, podría usar una línea como esta:

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

Esto declararía las tres variables sin escribir:

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

Espero que ayude.


23
Es un poco antiguo, pero es importante tener en cuenta: (1) el ejemplo que ha proporcionado no usa el operador de coma (las vardeclaraciones no usan el operador de coma , aunque sea una coma) y (2) no puede separar declaraciones que utilizan los operadores de coma; solo se permiten expresiones.
Qantas 94 Heavy

0

Agregar / modificar propiedades a un objeto y devolverlo en la misma línea es un posible caso de 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 función anónima anterior devuelve un objeto con valores aleatorios mayores que el valor de entrada o, si no hay ninguno, con el valor de entrada en sí en una matriz contenida en la biggerpropiedad.

Sigue siendo azúcar sintáctico (como funciones de flecha ), pero acorta el número de líneas ... Me pregunto si algunos minificadores JS detectan y ajustan el código de manera similar automáticamente. Ejecútelo en su consola:

((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
Pero, por supuesto, no pondrías tales encantamientos crípticos en el código de producción, ¿verdad?
Lightness Races in Orbit

@LightnessRacesinOrbit bueno, diré que depende del propósito (por ejemplo, enseñanza, código abreviado, sin declaraciones de variables / funciones, etc.). Si lo sangra como lo hice anteriormente, es perfectamente legible ... No puedo dejar de notar que usó la palabra "críptico" :)
CPHPython

1
Je, eso ni siquiera fue deliberado 😂
Lightness Races in Orbit
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.