Что делает оператор запятой в JavaScript?

#javascript #arrays #comma

#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
  

Комментарии:

1. Я удивлен, что 09 не терпит неудачу для незаконного ‘9’ в восьмеричном литерале.

2. @recursive — любое число 9 в восьмеричном представлении приводит к возврату к десятичному.

3. Не путайте запятую в списке аргументов. alert принимает только один аргумент. Все, что после этого, отбрасывается.

4. @Andrew: да, отбрасывается alert() , который принимает только один аргумент, но он будет запущен! Это странно. Спасибо.

5. @Topera: не очень странно, если подумать об этом с точки зрения JS. В JS вам не нужно указывать свой список аргументов в объявлении функции (вместо этого вы можете использовать arguments объект, который может быть любой длины). Даже с современным скомпилированным JS невозможно заранее определить, сколько аргументов будет принимать функция. Рассмотрим это: function test() { args=[]; for (var i = 0; i < arguments.length; i ) { args.push(arguments[i] 1); } ; Интерпретатор должен был бы знать, как использовалась функция, чтобы знать, сколько аргументов потребуется. Вместо этого он оценивает все.

Ответ №1:

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

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

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

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

Комментарии:

1. Я не могу вспомнить много случаев, когда оператор запятой используется для какого-либо воздействия, кроме сохранения символов (сокращения) или запутывания кода.

2. @user17753 его можно использовать на законных основаниях в разделе for цикла, разделенном точкой с запятой.

3. @Cyoce: Хотя это правда, говоря в целом, такая логика более четко выполняется в теле цикла. Затем некоторые люди будут утверждать, что их способ допускает несколько continue точек без дублирования, но тогда у вас не должно быть нескольких continue точек.

4. @user17753 Ты на деньгах; я здесь потому, что пытаюсь понять небольшой фрагмент сокращенного кода

5. Vue документы используют его в своем примере компиляции шаблона

Ответ №2:

Еще немного для рассмотрения:

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

Ответ №3:

Специфический синтаксис позволяет вам функционально выпекать хлеб и передавать его клиенту для потребления без return s .

 (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.
  

Ответ №4:

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

 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)
  

Комментарии:

1. Но, конечно, вы бы не стали вставлять такие загадочные заклинания в производственный код, верно?

2. @LightnessRacesinOrbit ну, я скажу, что это зависит от цели (например, обучение, сокращение кода, отсутствие объявлений переменных / функций и т. Д.). Если вы сделаете отступ, как я сделал выше, он будет отлично читаем… Не могу перестать замечать, что вы использовали слово «загадочный» 🙂

3. Хех, это даже не было преднамеренным 😂

Ответ №5:

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

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

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

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

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

Комментарии:

1. Это немного устарело, но важно отметить: (1) в приведенном вами примере не используется оператор запятой ( var в объявлениях не используется оператор запятой, даже если это запятая) и (2) вы не можете разделять состояния с помощью операторов запятой; разрешены только выражения.