Bỏ biểu thức thứ hai khi sử dụng tốc ký if-other


290

Tôi có thể viết tốc if elseký mà không cần else?

var x=1;

x==2 ? dosomething() : doNothingButContinueCode();   

Tôi đã nhận thấy việc đặt nullcho các công việc khác hoạt động (nhưng tôi không biết tại sao hoặc nếu đó là một ý tưởng tốt).

Chỉnh sửa: Một số bạn có vẻ bối rối tại sao tôi lại cố gắng thử điều này. Hãy yên tâm rằng nó hoàn toàn không tò mò. Tôi thích làm rối tung với JavaScript.


Tôi nghĩ rằng có một var | varcú pháp. Cẩn thận vì nó rất khó để "nhìn thấy", đặc biệt là các bộ ba (IMO) đang gặp vấn đề. Sử dụng một cách tiết kiệm.
Jared Farrish

@JaredFarrish Không phải toàn bộ vấn đề của chim nhạn là chúng dễ "nhìn thấy" hơn là sử dụng câu lệnh if? Ngoài ra, cú pháp mà bạn đang nói là gì, nó có vẻ thú vị.
Hassan

1
Không, tôi không nghĩ rằng họ dễ dàng hơn trong mọi trường hợp. "Toàn bộ điểm" trong tâm trí của tôi là đặt tất cả trên một dòng ("mã của tôi ngắn hơn của bạn") hoặc cho các trường hợp cụ thể, theo nghĩa đen với kết quả đơn giản. Ternaries xếp chồng là đặc biệt nguy hiểm và nên tránh bằng mọi giá. :)
Jared Farrish

1
@Hassan - Tôi đã thấy một cái gì đó như thế foo = bar | cat;, nếu cái đầu tiên là sai? null?, nó "rơi qua" đến lần thứ hai. Tôi chỉ nhìn thấy nó, mặc dù, và không sử dụng nó.
Jared Farrish

3
@JaredFarrish: Điều đó a || bhoặc a && b, nếu không bsẽ luôn được đánh giá.
kennytm

Câu trả lời:


263

Đây cũng là một lựa chọn:

x==2 && dosomething();

dosomething()sẽ chỉ được gọi nếu x==2được đánh giá là đúng. Điều này được gọi là ngắn mạch .

Nó không được sử dụng phổ biến trong các trường hợp như thế này và bạn thực sự không nên viết mã như thế này. Tôi khuyến khích cách tiếp cận đơn giản hơn này:

if(x==2) dosomething();

Bạn nên viết mã có thể đọc được mọi lúc; nếu bạn lo lắng về kích thước tệp, chỉ cần tạo một phiên bản rút gọn của nó với sự trợ giúp của một trong nhiều trình nén JS. (ví dụ: Trình biên dịch đóng cửa của Google )


10
Oh, ngắn mạch, phải. Khả năng đọc mã được đánh giá cao Tôi nghĩ ở hầu hết các nhà phát triển trung gian và một số "chuyên gia dày dạn".
Jared Farrish

2
Về mặt kỹ thuật, bạn không cần niềng răng: if (1 - 1 === 0) $('.woot').text('Woot!'); Tôi sử dụng hình thức đó mọi lúc với PHP và bây giờ tôi đang áp dụng Coffeescript, tôi cũng sử dụng nó trong Javascript của mình.
được hollenbeck

5
Cá nhân tôi tin rằng nếu nó nhỏ nếu có một kết quả nếu đúng .. thì viết nhanh hơn và dễ dàng hơn x == 2 && dosthing ();
Dean Meehan

9
if x==2 && doSomething() || doSomethingElse()
Agustín

1
Tôi muốn JavaScript bao gồm cú pháp giống như Ruby này : doSomething() if x === 2. Tôi không nhớ Ruby, nhưng tôi nhớ điều đó.
Chad Johnson

743

Những gì bạn có là một cách sử dụng khá bất thường của toán tử ternary . Thông thường, nó được sử dụng như một biểu thức, không phải là một câu lệnh, bên trong một số hoạt động khác, ví dụ:

var y = (x == 2 ? "yes" : "no");

Vì vậy, để dễ đọc (vì những gì bạn đang làm là không bình thường) và vì nó tránh được "cái khác" mà bạn không muốn, tôi sẽ đề nghị:

if (x==2) doSomething();

Ở đây, chúng ta có thể thêm dòng hoàn thiện được chèn dưới dạng một lệnh đầy đủ (ví dụ của tôi sử dụng hàm jquery fade in và fade out) x == 2? $ (phần tử) .fadeIn (): $ (phần tử) .fadeIn (); Không bắt buộc phải có biến trả về (như var y trong mã đầu tiên).
Ca ngợi thần linh

1
bạn phải sử dụng dấu ba "=" để logic hoàn hảo. như trong var y = (x === 2? "có": "không");
fino

63

Một lựa chọn khác:

x === 2 ? doSomething() : void 0;

3
Nếu ai đó không biết tại sao sử dụng void 0 tôi khuyên bạn nên đọc liên kết
Carlinhos

20

Nếu bạn không làm khác, tại sao không làm:

if (x==2) doSomething();

4
bạn có thể làm điều đó ngay cả khi bạn làm việc khác
nmirceac

14

Sử dụng nulllà tốt cho một trong các nhánh của một biểu thức ternary. Và một biểu thức ternary là tốt như một tuyên bố trong Javascript.

Tuy nhiên, về mặt phong cách, nếu bạn có ý định gọi một thủ tục, thì rõ ràng hơn là viết điều này bằng cách sử dụng if..else:

if (x==2) doSomething;
else doSomethingElse

hoặc, trong trường hợp của bạn,

if (x==2) doSomething;

6

Bổ sung nhỏ cho chủ đề rất cũ này ..

Nếu bạn đang đánh giá một biểu thức bên trong một vòng lặp for/ whilevới một toán tử tạm thời và muốn continuehoặc breakkết quả là - bạn sẽ gặp vấn đề vì cả hai continue& breakkhông phải là biểu thức , chúng là các câu lệnh không có giá trị.

Điều này sẽ tạo ra Uncaught SyntaxError: Unexpected token continue

 for (const item of myArray) {
      item.value ? break : continue;
 }

Nếu bạn thực sự muốn một lớp lót trả về một câu lệnh, bạn có thể sử dụng cái này thay thế:

  for (const item of myArray) {
      if (item.value) break; else continue;
  }
  • PS - Mã này có thể nâng một số lông mày. Chỉ cần nói .. :)

4

Về mặt kỹ thuật, đặt null hoặc 0 hoặc chỉ một số giá trị ngẫu nhiên ở đó hoạt động (vì bạn không sử dụng giá trị trả về). Tuy nhiên, tại sao bạn sử dụng cấu trúc này thay vì ifcấu trúc? Rõ ràng là những gì bạn đang cố gắng làm khi bạn viết mã theo cách này, vì bạn có thể nhầm lẫn mọi người với no-op (null trong trường hợp của bạn).


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.