Dấu phẩy làm gì trong các biểu thức JavaScript?


89

Nếu tôi sử dụng:

1.09 * 1; // returns "1.09"

Nhưng nếu tôi sử dụng:

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

Tôi biết rằng 1,09 không phải là một con số.

Dấu phẩy có tác dụng gì trong đoạn mã cuối cùng?

Các ví dụ khác

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
Tôi ngạc nhiên rằng 09 không thất bại vì '9' bất hợp pháp theo nghĩa đen.
đệ quy

7
@recursive - bất kỳ số 9 nào trong biểu diễn bát phân dẫn đến dự phòng về số thập phân.
Yuval Adam

Đừng nhầm lẫn dấu phẩy trong danh sách đối số. alertchỉ có một đối số. Bất cứ thứ gì sau đó đều bị loại bỏ.
Andrew

@Andrew: vâng, bị loại bỏ bởi alert (), chỉ cần một đối số, nhưng nó sẽ bị chạy! Lạ nhỉ. Cảm ơn.
Topera

1
@Topera: không thực sự lạ nếu bạn nghĩ về nó từ góc độ của JS. Trong JS, bạn không phải chỉ định danh sách đối số trong khai báo hàm của mình ( argumentsthay vào đó bạn có thể sử dụng đối tượng, có thể có độ dài bất kỳ). Ngay cả với JS được biên dịch hiện đại, sẽ không có cách nào để nói trước một hàm sẽ nhận bao nhiêu đối số. Hãy xem xét điều này: function test() { args=[]; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i] + 1); } ;Trình thông dịch sẽ phải biết hàm đang được sử dụng như thế nào để biết nó sẽ chiếm bao nhiêu args. Thay vào đó, nó đánh giá mọi thứ.
Andrew

Câu trả lời:


95

Toán tử dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng thứ hai.

Nguồn: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special_Operators/Comma_Operator

Ví dụ, biểu thức 1,2,3,4,5đánh giá là 5. Rõ ràng là toán tử dấu phẩy chỉ hữu ích cho các phép toán có tác dụng phụ.

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


2
Họ lấy nó từ C. Tôi nghĩ nó chỉ hữu ích cho những biểu hiện có tác dụng phụ.
Radomir Dopieralski

3
Tôi không thể nghĩ đến nhiều trường hợp mà toán tử dấu phẩy được sử dụng để bất kỳ ảnh hưởng nào ngoại trừ việc lưu các ký tự (rút gọn) hoặc mã làm xáo trộn.
user17753,

1
@ user17753 nó có thể được sử dụng hợp pháp trong phần được phân tách bằng dấu chấm phẩy của forvòng lặp.
Cyoce

1
@Cyoce: Trong khi điều đó đúng, nói chung logic như vậy được thực hiện rõ ràng hơn trong phần thân vòng lặp. Một số người sau đó sẽ cho rằng cách của họ cho phép nhiều continueđiểm mà không bị trùng lặp, nhưng bạn không nên có nhiều continueđiểm.
Lightness Races in Orbit vào

@ user17753 Bạn đang kiếm tiền; cố gắng hiểu một đoạn mã nhỏ được rút gọn là lý do tại sao tôi ở đây
Hiếm khi 'Where's Monica' Needy

6

Một số khác cần xem xét:

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


7
Lol, thật là vui:alert("1", alert("2", alert("3")))
Topera

1
@Andrew: Rất tiếc, tôi đã cập nhật câu trả lời của mình với những gì tôi muốn sử dụng.
Douglas

Toán tử dấu phẩy đánh giá từng toán hạng của nó (từ trái sang phải) và trả về giá trị của lasttoán hạng.
xgqfrms

2
Toán tử dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của second toán hạng.

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

Nó phải như thế này!

Toán tử dấu phẩy đánh giá từng toán hạng của nó (từ trái sang phải) và trả về giá trị của lasttoán hạng.

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


5
Toán tử dấu phẩy nhận hai toán hạng, vì vậy trích dẫn ban đầu là chính xác. Những gì bạn đang nói đến là kết quả cuối cùng của việc lồng các biểu thức như vậy, nhưng điều đó có nghĩa là trích dẫn thay thế của bạn bị viết sai một cách tinh vi. a,b,c,d((((a),b),c),d)
Lightness Races ở Orbit

1

Hãy xem ở đây - dấu phẩy là viết tắt của nhiều biểu thức / câu lệnh. Ví dụ trong mã của bạn, bạn có thể sử dụng một dòng như thế này:

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

Điều này sẽ khai báo tất cả ba biến mà không cần viết:

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

Hy vọng rằng sẽ giúp.


23
Nó hơi cũ, nhưng cần lưu ý quan trọng: (1) ví dụ bạn đã cung cấp không sử dụng toán tử dấu phẩy (các varkhai báo không sử dụng toán tử dấu phẩy , mặc dù đó là dấu phẩy) và (2) bạn không thể tách trạng thái sử dụng các toán tử dấu phẩy; chỉ các biểu thức được cho phép.
Qantas 94 Heavy

0

Thêm / sửa đổi các thuộc tính vào một đối tượng và trả lại nó trong cùng một dòng là một trường hợp sử dụng có thể xảy ra:

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

Hàm ẩn danh ở trên trả về một đối tượng có giá trị ngẫu nhiên lớn hơn giá trị đầu vào hoặc nếu không có, với giá trị đầu vào chính nó trong một mảng có trong thuộc biggertính.

Nó vẫn là đường cú pháp (như các hàm mũi tên ), nhưng nó rút ngắn số dòng ... Tôi tự hỏi liệu một số trình thu nhỏ JS có tự động phát hiện và điều chỉnh mã theo cách tương tự không. Chạy nó trong bảng điều khiển của bạn:

((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
Nhưng tất nhiên là bạn sẽ không đưa những câu thần chú khó hiểu như vậy vào mã sản xuất, phải không?
Lightness Races ở Orbit

@LightnessRacesinOrbit tốt, tôi sẽ nói nó tùy thuộc vào mục đích (ví dụ: dạy, rút ​​gọn mã, không có khai báo biến / hàm, v.v.). Nếu bạn thụt nó như tôi đã làm ở trên, nó là hoàn toàn có thể đọc được ... Không thể dừng nhận thấy rằng bạn đã dùng từ "khó hiểu" :)
CPHPython

1
Heh, mà không được thậm chí cân nhắc 😂
Lightness Races ở Orbit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.