2012-06-22 38 views
26

Vì vậy, tôi đang tìm cách viết một thao tác phức tạp hơn một chút với các toán tử logic trong một câu lệnh if-else. Tôi biết tôi có thể làm dấu ngoặc đơn, và tôi biết đó là cách tốt hơn để làm điều này, nhưng tôi đã tò mò và vì vậy tôi sẽ hỏi. Nếu tôi phải làm một việc như thế này:Toán tử logic nào ưu tiên

if (firstRun == true || selectedCategory != undefined && selectedState != undefined) { 
//Do something 
} else { 
//Do something else 
} 

Làm cách nào để hoạt động mà không sử dụng dấu ngoặc đơn? Tôi biết có một thứ tự hoạt động cho các nhà khai thác logic, tương tự như PEMDAS, phải không? Tôi tò mò nếu nó sẽ chạy một cái gì đó như thế này:

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

hoặc có thể nếu nhà điều hành các 'OR' được ưu tiên thay vào đó và nó kết thúc sẽ như:

(firstRun == true || selectedCategory != undefined) && selectedState != undefined 

Danh sách đầy đủ sẽ được tốt đẹp, nếu bạn có thể tìm thấy nó ở đâu đó, của thứ tự của các hoạt động cho việc này. Cảm ơn!

Trả lời

44

Quy tắc của ngón tay cái, trong đó bao gồm cơ bản 99% của tất cả các trường hợp sử dụng cho báo cáo có điều kiện, là:

  1. Nhóm: ()
  2. Thành viên truy cập . or [...]
  3. Không: !
  4. So sánh, ví dụ < , >= , === , !=, ...
  5. logic AND &&
  6. logic OR ||

MDN mang đến cho bạn sự sụp đổ toàn diện: Javascript Operator Precedence

ví dụ như vậy của bạn:

(firstRun == true || selectedCategory != undefined && selectedState != undefined) 

bằng

(firstRun == true) || ((selectedCategory != undefined) && (selectedState != undefined)) 

Đối với bất kỳ điều gì phức tạp hơn so với các trường hợp đã đề cập ở trên, tôi sẽ xem xét việc tái cấu trúc mã cho mọi người có thể đọc được!

+0

Chính xác những gì cần thiết; cảm ơn – JTApps

+0

Điều gì về 'mới'? Nó có quyền ưu tiên giống như truy cập thành viên và các cuộc gọi hàm, vì vậy tôi cho rằng điều đó có nghĩa là từ trái sang phải? 'new Foo(). bar()' tương đương với '(new Foo()). bar()'? Và 'Foo mới() (3)' tương đương với '(new Foo()) (3)'? – chharvey

1

Nó sẽ là người đầu tiên:

firstRun == true || (selectedCategory != undefined && selectedState != undefined) 

Theo nguyên tắc chung trong hầu hết các ngôn ngữ lập trình và có quyền ưu tiên cao hơn

7

Xem this chart for precedence.

Tôi sẽ không giải thích điều gì xảy ra vì người tiếp theo đọc mã của bạn sẽ nghĩ: "WTF? Liệu điều đó có làm được những gì cần không?"

Vì vậy, giải pháp tốt hơn là để bọc các điều khoản trong ngoặc ngay cả khi bạn biết ưu tiên, áp dụng nó một cách chính xác mã làm việc

này sau sự khôn ngoan cũ mà bạn không nên làm tất cả mọi thứ bạn có thể chỉ vì bạn có thể làm điều đó. Luôn luôn giữ một mắt trên những hậu quả.

+0

+1 để tư vấn việc sử dụng dấu ngoặc đơn. – geekchic

+0

Vâng, tôi hiểu những gì bạn đang nói và tôi biết, điểm yêu cầu đối với tôi là nhiều hơn cho kiến ​​thức cá nhân hơn bất cứ điều gì. Cảm ơn – JTApps

1

trong khi ưu tiên toán tử logic là không thực sự được định nghĩa trong ECMAScript Specification, MDN làm một công việc khá tốt của nó và thậm chí có một trang riêng biệt cho Logical Operators.Mối quan tâm của tôi, tôi cho rằng, vì ưu tiên toán tử logic không thực sự được xác định trong Đặc tả ECMAScript, mỗi nhà cung cấp trình duyệt riêng lẻ có thể khác nhau (tôi đang nói chuyện với bạn, Internet Explorer!) Để YMMV.

Trong bất cứ sự kiện muốn kiểm tra điều này trên các trình duyệt khác nhau, đây là một trường hợp thử nghiệm fiddle: http://jsfiddle.net/HdzXq/

6

Có một quy tắc khá tốt của ngón tay cái để này. Hãy suy nghĩ về các nhà khai thác như của những người thân toán học:

  • AND là nhân (. Ví dụ 0 * 1 = 0 => FALSE)
  • OR sẽ bổ sung (0 + 1 = 1 => TRUE ví dụ.)

Khi bạn nhớ điều này, tất cả các bạn phải biết là phép nhân luôn luôn có trước khi thêm.

+1

điều này thực sự là một sự ghi nhớ thực sự tốt đẹp, cả về mặt sự kiện cũng như các giá trị của các bit kết quả! – Christoph

Các vấn đề liên quan