Что делает запятая в выражениях JavaScript?

Если я использую:

1.09 * 1; // returns "1.09"

Но если я использую:

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

Я знаю, что 1,09 не число.

Что делает запятая в последнем куске кода?

Больше примеров

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

6 ответов

Решение

Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.

Источник: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Например, выражение 1,2,3,4,5 оценивает 5, Очевидно, оператор запятой полезен только для операций с побочными эффектами.

Еще несколько предупреждений для рассмотрения:

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

Кроме того, посмотрите на консоль Firebug, если вы хотите попробовать это в интерактивном режиме.

Посмотрите здесь - запятая обозначает несколько выражений / операторов. Например, в вашем коде вы можете использовать такую ​​строку:

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

Это объявит все три переменные без записи:

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

Надеюсь, это поможет.

Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение second операнд.

/questions/30065119/chto-delaet-zapyataya-v-vyirazheniyah-javascript/30065139#30065139

Так и должно быть!

Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение last операнд.

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

The specific syntax allows you to functionally bake bread and hand it to the customer to consume with no returns.

      (new Array(3)).fill()
.map(()=>({state:"dough", bake(){this.state="baked"}, consume(){this.state="consumed"}}))

.map(bread=>(console.log(`Adding ${bread.state} to oven.`), bread.bake(), bread))
.map(bread=>(console.log(`Consuming ${bread.state} bread.`), bread.consume(), bread))
.map(bread=>console.log(`Bread is now ${bread.state}.`))
      Adding dough to oven.
Adding dough to oven.
Adding dough to oven.
Consuming baked bread.
Consuming baked bread.
Consuming baked bread.
Bread is now consumed.
Bread is now consumed.
Bread is now consumed.

Добавление / изменение свойств к объекту и возвращение его в одной строке - это возможный вариант использования:

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

Вышеуказанная анонимная функция возвращает объект со случайными значениями, большими, чем входное значение, или, если его нет, с самим входным значением в массиве, содержащемся в bigger имущество.

Это все еще синтаксический сахар (например, функции стрелок), но он сокращает количество строк... Интересно, некоторые минификаторы JS обнаруживают и корректируют код подобным образом автоматически. Запустите его в своей консоли:

((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)
Другие вопросы по тегам