Câu lệnh 'if' của JavaScript - cú pháp tốt nhất, phương án này?


201

Điều đó đã được đặt rõ ràng, mặc dù ý kiến ​​không hơn không kém, việc gửi các dấu ngoặc nhọn trên một ifcâu lệnh đơn không phải là lý tưởng cho khả năng duy trì và dễ đọc.

Nhưng những gì về điều này?

if (lemons) { document.write("foo gave me a bar"); }

Nó thậm chí còn được nén nhiều hơn và nếu được mở rộng, dấu ngoặc nhọn sẽ không bị lãng quên. Có bất kỳ vấn đề trắng trợn, và nếu không, những cân nhắc là gì? Tôi cảm thấy như nó vẫn rất dễ đọc, ít nhất là nhiều như một nhà điều hành ternary. Đối với tôi, có vẻ như các nhà khai thác ternary không đề xuất nhiều do tính dễ đọc, mặc dù tôi cảm thấy rằng kết luận đó không hoàn toàn nhất trí.

Sinh đôi xấu xa trong tôi muốn đề xuất điều này, mặc dù cú pháp rõ ràng không có ý nghĩa với nó, và có lẽ chỉ là một ý tưởng tồi.

(syntax) ? document.write("My evil twin emerges"): "";

2
Sẽ rất tuyệt nếu JavaScript hỗ trợ kết thúc cụm từ có điều kiện:document.write("My evil twin emerges") if lemons
Beau Smith

7
Tôi nghĩ rằng bạn có thể đang suy nghĩ về câu lệnh if nếu khác. ( variable = (condition) ? true-value : false-value;.) Chúc may mắn.
Progo

Câu trả lời:


328

Tôi đã thấy hành vi ngắn mạch của &&nhà điều hành được sử dụng để đạt được điều này, mặc dù những người không quen với điều này có thể thấy khó đọc hoặc thậm chí gọi nó là một mô hình chống:

lemons && document.write("foo gave me a bar");  

Cá nhân, tôi sẽ thường sử dụng một dòng ifkhông có dấu ngoặc, như thế này:

if (lemons) document.write("foo gave me a bar");

Nếu tôi cần thêm nhiều câu lệnh vào, tôi sẽ đặt các câu lệnh trên dòng tiếp theo và thêm dấu ngoặc. Vì IDE của tôi thực hiện thụt lề tự động, các phản đối về khả năng duy trì đối với thực hành này là không cần thiết.


11
Tôi thích cái sau. Cảm ơn cho đầu vào và một thay thế sáng tạo hơn trên đầu tiên!
David Hobs

bạn nên biết những gì bạn đang mong đợi, vì chuỗi rỗng và 0 là các giá trị sai lệch, nó sẽ không thực hiện câu lệnh thứ hai
Orlando

1
Tất nhiên, bạn cũng có thể đặt một tuyên bố boolean rõ ràng hơn vào đó
acjay

7
@PeterOlson tại sao các phản đối bảo trì moot? Điều gì xảy ra nếu bất kỳ nhà phát triển nào khác không sử dụng IDE của bạn với cấu hình của nó.
agconti

2
Cảm ơn bạn đã đủ can đảm để lên tiếng ủng hộ một dòng nếu tuyên bố không có dấu ngoặc. Một ngày nào đó con của chúng tôi sẽ cảm ơn bạn.
Marc M.

136

Tôi sử dụng nó như thế này:

(lemons) ? alert("please give me a lemonade") : alert("then give me a beer");

36
alert(lemons?"please give me a lemonade":"then give me a beer")
MrVaykadji

43

Bạn có thể sử dụng định dạng này, thường được sử dụng trong PHP:

(lemon) ? document.write("foo gave me a bar") : document.write("if condition is FALSE");

12
Bạn không cần dấu ngoặc trên lemon.
leymannx

6
Có thể thực hành tốt nhất để bao gồm () xung quanh một tuyên bố có điều kiện - loại bỏ bất kỳ sự nhầm lẫn nào về thứ tự các hoạt động, vv cho các nhà phát triển khác. Tôi thường sai lầm khi chỉ định nó trừ khi không có cách nào để một người nào đó đủ tiêu chuẩn bị nhầm lẫn.
djvs

1
document.write(lemon ? "foo gave me a bar" : "if condition is FALSE");:)
Joseph Goh

Tôi thích các dấu ngoặc đối với tôi, chúng ngụ ý một sự ép buộc boolean.
Daniel Sokolowski

18

Dòng này sạch hơn nhiều.

if(dog) alert('bark bark');

Tôi thích điều này. hy vọng nó sẽ giúp được ai đó


16

có thể sử dụng cái này,

lemons ? alert("please give me a lemonade") : alert("then give me a beer");

giải thích: nếu lemonstồn tại thì cho tôi mộtalert("please give me a lemonade") else alert("then give me a beer")


Giải pháp tuyệt vời.
Davidson Lima

1
lemons? alert("please give me a fancy beer with a lemon wedge in it"): alert(please give me a beer")FTFY
stib

15

// Một ví dụ đơn giản khác

 var a = 11;
 a == 10 ? alert("true") : alert("false");

15
Tại sao không đơn giản .. var a = 11; alert(a === 10);?
ManuKaracho

@ManuKaracho Tôi thấy vấn đề này rất nhiều khi làm việc với các báo cáo ternary. Tôi hiểu OP có thể vừa mới cố gắng viết một cái đơn giản nhưng nó tràn lan trong mã tôi đọc trong công việc.
adam-beck

alert(a === 10 ? "true" : "false")
Josh Wood

@JoshWood cảnh báo cũng sẽ in booleans, vì vậy bạn chỉ có thể làm alert(a===10)như Manu nói.
Keith

12

Như nhiều người đã nói, nếu bạn đang tìm kiếm 1 dòng thực tế thì nếu:

    if (Boolean_expression) do.something();

được ưa thích. Tuy nhiên, nếu bạn đang tìm cách làm if / other thì ternary là bạn của bạn (và cũng cực hay):

    (Boolean_expression) ? do.somethingForTrue() : do.somethingForFalse();

CŨNG THẾ:

    var something = (Boolean_expression) ? trueValueHardware : falseATRON;

Tuy nhiên, tôi thấy một ví dụ rất tuyệt Hét lên @ Peter-Oslson cho &&

    (Boolean_expression) && do.something();

Cuối cùng, đó không phải là một câu lệnh if mà là thực thi mọi thứ trong một vòng lặp với bản đồ / thu nhỏ hoặc Promise.resolve () cũng rất thú vị. Hét lên @brunettdan


7

Như đã nêu, bạn có thể sử dụng:

&& Phong cách

lemons && document.write("foo gave me a bar");  

hoặc là

kiểu không khung

if (lemons) document.write("foo gave me a bar");

ngắn mạch trở lại

Tuy nhiên, nếu bạn muốn sử dụng ifcâu lệnh một dòng để ngắn mạch một chức năng, bạn cần phải đi với phiên bản không có khung như vậy:

if (lemons) return "foo gave me a bar";

như

lemons && return "foo gave me a bar"; // does not work!

sẽ cho bạn một SyntaxError: Unexpected keyword 'return'


Trong các mạch ngắn mạch đơn, chúng ta có thể bỏ qua 'return' và nó sẽ hoạt động như mong đợi. `` `chanh &&" foo đã cho tôi một thanh "; // làm! `` `
siwalikm

@siwalikm bạn có thể giải thích? Đây là trường hợp bạn không muốn quay lại lemons(nếu đó là chim ưng) - bạn chỉ muốn trả lại "foo đã cho tôi thanh" khi đó lemonslà sự thật.
Marc

if (chanh) trả lại "foo cho tôi một thanh"; cái này sai. Nó sẽ cung cấp cho bạn "Uncaught SyntaxError: Tuyên bố hoàn trả bất hợp pháp"
Fenec

@Fenec bạn có thể chia sẻ trình duyệt và phiên bản gây ra lỗi này không? Điều này làm việc cho tôi gần 2 năm trước và tiếp tục làm việc cho tôi.
Marc

4

Tôi đã thấy nhiều câu trả lời với nhiều phiếu ủng hộ sử dụng toán tử ternary. Ternary là tuyệt vời nếu a) bạn có một lựa chọn thay thế và b) bạn đang trả về một giá trị khá đơn giản từ một điều kiện đơn giản. Nhưng...

Câu hỏi ban đầu không có giải pháp thay thế và toán tử ternary chỉ có một nhánh (thực) buộc bạn phải trả lời câu trả lời bị nhầm lẫn.

lemons ? "foo gave me a bar" : "who knows what you'll get back"

Tôi nghĩ rằng biến thể phổ biến nhất là lemons ? 'foo...' : '', và, như bạn sẽ biết khi đọc vô số bài báo cho bất kỳ ngôn ngữ nào về đúng, sai, trung thực, falsey, null, nil, trống, trống (có mà không có?), Bạn đang nhập một bãi mìn (mặc dù là một bãi mìn được ghi chép tốt.)

Ngay khi bất kỳ phần nào của ternary trở nên phức tạp, bạn nên có một hình thức điều kiện rõ ràng hơn.

Một chặng đường dài để nói rằng tôi đang bỏ phiếu cho if (lemons) "foo".


2

Nó cũng có thể được thực hiện bằng cách sử dụng một dòng duy nhất với whilecác vòng lặp và ifnhư thế này:

if (blah)
    doThis();

Nó cũng hoạt động với whilecác vòng lặp.


7
Điều này sẽ thất bại và không được khuyến khích
danwellman

9
OP cũng yêu cầu một lớp lót.
mã hóa aaron

2

Ví dụ trong các hàm mũi tên:

let somethingTrue = true
[1,2,3,4,5].map(i=>somethingTrue && i*2)

Trong lời hứa:

Promise.resolve()
  .then(_=>checkTrueFalse && asyncFunc())
  .then(_=>{ .. })

Nếu không thì:

if(somethingTrue) thenDo()

Nếu đó chỉ là một điều kiện đơn giản, tôi thích sử dụng if (value) bất cứ khi nào có thể bởi vì từ nếu ở phần đầu của câu nói sẽ nói nhiều hơn về những gì đang xảy ra hơn là phép so sánh và dấu hỏi.


1
**Old Method:**
if(x){
   add(x);
}
New Method:
x && add(x);

Ngay cả thao tác gán cũng chúng ta có thể làm với dấu ngoặc tròn

exp.includes('regexp_replace') && (exp = exp.replace(/,/g, '@&'));

"Ngay cả thao tác gán cũng chúng ta có thể làm với dấu ngoặc tròn". Điều này rất thú vị, tôi không biết rằng có thể thực hiện các thao tác gán bên trong các hoạt động đơn dòng này.
sagits
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.