Co robi przecinek w wyrażeniach JavaScript?

Jeśli użyję:

1.09 * 1; // returns "1.09"

Ale jeśli użyję:

1,09 * 1; // returns "9"
Wiem, że 1,09 nie jest liczbą.

Co robi przecinek w ostatnim fragmencie kodu?

Więcej Przykładów

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
Author: Topera, 2010-08-25

5 answers

Operator przecinka ocenia oba jego operandów (od lewej do prawej) i Zwraca wartość drugiego operand.

Źródło: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Na przykład wyrażenie 1,2,3,4,5 jest ewaluowane do 5. Oczywiście operator przecinka jest przydatny tylko dla operacji z efektami ubocznymi.

 70
Author: Yuval Adam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-24 21:09:55

Jeszcze kilka wpisów do rozważenia:

alert((0, 9));
alert((9, 0));
alert(("foo", "bar"));

Zajrzyj również do konsoli Firebug, Jeśli chcesz wypróbować ją interaktywnie.

 5
Author: Douglas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-25 08:43:08

Spójrz tutaj - przecinek oznacza wiele wyrażeń / instrukcji. Na przykład w kodzie możesz użyć takiej linii:

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

To zadeklaruje wszystkie trzy zmienne bez zapisu:

var a=0;
var b=0;
var c=0;
Mam nadzieję, że to pomoże.
 4
Author: dhh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 15:43:47
Operator przecinka ocenia zarówno jego operandów (od lewej do prawej) i Zwraca wartość second operand.

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

Tak powinno być!

Operator przecinka ocenia każdy ze swoich operandów (od lewej do prawej) i zwraca wartość last operand.

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

 2
Author: xgqfrms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-15 16:31:36

Dodanie / modyfikacja właściwości do obiektu i zwrócenie go w tej samej linii jest możliwym przypadkiem użycia:

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]
// }

Powyższa funkcja anonimowa zwraca obiekt o losowych wartościach większych niż wartość wejściowa lub, jeśli jej nie ma, z samą wartością wejściową w tablicy zawartej we właściwości bigger.

Nadal jest cukrem składniowym (jak Funkcje strzałek ), ale skraca liczbę linii... Ciekawe czy jakieś minifigurki JS automatycznie wykrywaj i dostosowuj kod w podobny sposób. Uruchom go w konsoli:

((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)
 0
Author: CPHPython,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 12:12:34