#javascript #function #numbers
#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:
Оператор запятой вычисляет оба своих операнда (слева направо) и возвращает значение второго операнда.
Источник: 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
единиц равным нулю. Все это с помощью функций со стрелками в скобках.
(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.
Комментарии:
1. Какая разница, если я использую
{}
with;
вместо()
with,
?2. @YuJiaao Нет необходимости явно использовать ключевое слово
return
.
Ответ №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) вы не можете разделять состояния с помощью операторов запятой; разрешены только выражения.