Jeśli używam:
1.09 * 1; // returns "1.09"
Ale jeśli używam:
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
javascript
comma-operator
Topera
źródło
źródło
alert
przyjmuje tylko jeden argument. Wszystko po tym jest odrzucane.arguments
zamiast tego użyć obiektu, który może mieć dowolną długość). Nawet w przypadku nowoczesnego skompilowanego JS nie byłoby sposobu, aby przewidzieć, ile argumentów zajmie funkcja. Rozważ to:function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;
interpreter musiałby wiedzieć, w jaki sposób funkcja była używana, aby wiedzieć, ile argumentów zajmie. Zamiast tego ocenia wszystko.Odpowiedzi:
Ź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
oblicza5
. Oczywiście operator przecinka jest przydatny tylko w przypadku operacji z efektami ubocznymi.console.log(1,2,3,4,5); console.log((1,2,3,4,5));
źródło
for
pętli.continue
punktów bez powielania, ale wtedy nie powinieneś mieć wielucontinue
punktów.Więcej do rozważenia:
console.log((0, 9)); console.log((9, 0)); console.log(("foo", "bar"));
źródło
alert("1", alert("2", alert("3")))
last
operandu.https://stackoverflow.com/a/3561056/5934465
Tak powinno być!
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
źródło
a,b,c,d
jest((((a),b),c),d)
Spójrz tutaj - przecinek oznacza wiele wyrażeń / instrukcji. Na przykład w swoim kodzie możesz użyć następującej linii:
var a=0, b=0, c=0;
To zadeklarowałoby wszystkie trzy zmienne bez pisania:
var a=0; var b=0; var c=0;
Mam nadzieję, że to pomoże.
źródło
var
deklaracje nie używają operatora przecinka , mimo że jest to przecinek) i (2) nie można go oddzielić zdania za pomocą operatorów przecinków; dozwolone są tylko wyrażenia.Dodanie / modyfikacja właściwości do obiektu i zwrócenie go w tym samym wierszu to możliwy przypadek 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 z losowymi wartościami większymi niż wartość wejściowa lub, jeśli ich nie ma, z samą wartością wejściową w tablicy zawartej we
bigger
właściwości.Wciąż jest to cukier syntaktyczny (podobnie jak funkcje strzałkowe ), ale skraca liczbę linii ... Zastanawiam się, czy niektóre minifierki 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)
źródło