Що робить кома у виразах JavaScript?


89

Якщо я використовую:

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" у восьмеричному буквалі.
рекурсивно

7
@recursive - будь-яке 9 у восьмеричному поданні призводить до повернення до десяткової.
Юваль Адам

Не плутайте кому у списку аргументів. alertприймає лише один аргумент. Все, що після цього, відкидається.
Ендрю

@Andrew: так, відкидається за допомогою alert (), який приймає лише один аргумент, але він буде запущений! Це дивно. Дякую.
Топера

1
@Topera: не дуже дивно, якщо ти думаєш про це з точки зору JS. У JS вам не потрібно вказувати список аргументів у декларації функції ( argumentsзамість цього ви можете використовувати об'єкт, який може бути будь-якої довжини). Навіть із сучасним скомпільованим JS, не було б можливості заздалегідь сказати, скільки аргументів прийме функція. Розгляньте це: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;інтерпретатор повинен був би знати, як використовується функція, щоб знати, скільки аргументів вона займе. Натомість вона оцінює все.
Ендрю

Відповіді:


95

Оператор кома обчислює обидва її операнди (зліва направо) і повертає значення другого операнда.

Джерело: 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));


2
Вони взяли це з C. Я думаю, це корисно лише для виразів, які мають побічні ефекти.
Радомир Доперальський

3
Я не можу подумати про багато випадків, коли оператор-кома використовується для будь-якого впливу, крім збереження символів (зменшення) або затуманення коду.
user17753

1
@ user17753 його можна використовувати законно у розділі forциклу, розділеному крапкою з комою .
Cyoce 24.03.17

1
@Cyoce: Хоча це правда, загалом кажучи, така логіка чіткіше виконується в тілі циклу. Тоді деякі люди будуть стверджувати, що їхній спосіб дозволяє безліч continueточок без дублювання, але тоді у вас не повинно бути декількох continueочок.
Гонки легкості на орбіті

@ user17753 Ви на грошах; спроба зрозуміти невеликий фрагмент мініфікованого коду - ось чому я тут
Рідко “Де Моніка”, потрібна

6

Ще дещо, щоб розглянути:

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


7
Лол, це весело:alert("1", alert("2", alert("3")))
Топера

1
@Andrew: На жаль, я оновив свою відповідь тим, що я мав намір використовувати.
Дуглас,

Оператор кома обчислює кожен його операнд (зліва направо) і повертає значення lastоперанда.
xgqfrms

2
Оператор кома обчислює обидва її операнди (зліва направо) і повертає значення second операнда.

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

Це повинно бути так!

Оператор кома обчислює кожен його операнд (зліва направо) і повертає значення lastоперанда.

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


5
Оператор-кома бере два операнди, тому вихідна лапка була правильною. Те, про що ви говорите, є кінцевим результатом вкладання таких виразів, але це означає, що ваша замінна цитата витончено неправильно введена. a,b,c,dє((((a),b),c),d)
Гонки легкості на орбіті

1

Погляньте тут - кома означає кілька виразів / тверджень. Наприклад, у коді ви можете використовувати такий рядок:

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

Це оголосить усі три змінні без запису:

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

Сподіваюся, що це допомагає.


23
Він трохи старий, але важливо зауважити: (1) наведений вами приклад не використовує оператор коми ( varдекларації не використовують оператор коми , хоча це кома) і (2) ви не можете відокремлювати статистичні дані з використанням операторів-коми; дозволяються лише вирази.
Qantas 94 Heavy

0

Додавання / модифікація властивостей до об’єкта та повернення його в одному рядку - можливий варіант використання:

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)

2
Але, звичайно, ви б не вкладали таких загадкових заклинань у виробничий код, так?
Гонки легкості на орбіті

@LightnessRacesinOrbit добре, я скажу, що це залежить від мети (наприклад, навчання, скорочення коду, відсутність оголошень змінних / функцій тощо). Якщо ви зробите відступ, як я робив вище, він чудово читається ... Не можу не перестати помічати, що ви
вжили

1
Хе, це навіть не було навмисно 😂
Гонки легкості на орбіті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.