2017-12-19 117 views
9

Tôi có hai chuỗi được lưu trữ trong a & b. Tôi muốn perfrom một số xác nhận nếu cả hai chuỗi có một số giá trị. Đối với điều này, tôi sử dụng:Thực hiện xnor trong javascript

if(a && b) { 
    //Do some processing. 
} 

Tuy nhiên, nếu một trong số chúng trống và khác thì không, thì tôi cần xử lý riêng. Nếu cả hai đều trống rỗng, tôi không cần phải làm gì cả. Vì vậy, về cơ bản để xử lý trường hợp này nó là trường hợp giả của XNOR. Tôi có thể làm theo cách này:

if((a && !b) || (!a && b)) { 
    //handle separately. 
} 

Có cách tiếp cận nào tốt hơn điều này không?

+0

Bạn có muốn biết đó oe là trống rỗng và cái nào không? Hoặc bạn chỉ muốn biết rằng chính xác là một trong những sản phẩm nào? –

+1

không, nhưng bạn có thể bỏ qua các dấu ngoặc đơn, vì ưu tiên toán tử của '&&' trên '||': 'if (a &&! B ||! A && b) {' –

+2

Nếu bạn thực hiện lần thứ hai 'if' an 'else' của cái đầu tiên, bạn có thể đơn giản hóa nó:' if (a && b) {...} else if if (a || b) {...} '. –

Trả lời

5

Hãy kết hợp hai riêng biệt nếu-tuyên bố của bạn thành một (một cách hiệu quả như nhau, nhưng sẽ giúp đơn giản hóa):

if (a && b) 
    // do some processing 
else if (a && !b || !a && b) 
    // do other processing 

Để tìm hiểu xem chúng ta có thể đơn giản hóa hơn nữa, chúng ta hãy nhìn vào bảng sự thật cho điều kiện thứ hai:

a | b | x 
-------------- 
1 | 0 | 1 (a && !b) 
0 | 1 | 1 (!a && b) 
0 | 0 | 0 (a && b) (negating the first if) 

Bạn có thể thấy rằng các kết quả tích cực (x = 1) có mặt khi a là đúng hay khi b là đúng, mà đơn giản hoá để a || b. Phiên bản cuối cùng của câu lệnh if của bạn sẽ trông giống như:

if (a && b) 
    // do some processing 
else if (a || b) 
    // do other processing 
3

JavaScript không có nhà khai thác XOR và XNOR. Có rất nhiều cách để thực hiện chúng, và cách bạn thực hiện nó là tốt. Một cách khác có thể bằng cách sử dụng các nhà điều hành ternary:

//XOR 
if(a ? !b : b) { 
    ... 
} 

//XNOR 
if(a ? b : !b) { 
    ... 
} 

Tuy nhiên, tất cả những phương pháp này có một nhược điểm của khả năng đánh giá ab nhiều hơn một lần. Đó có thể là vấn đề nếu a hoặc b là một hàm hoặc biểu thức. Cách tiếp cận tốt hơn có thể bằng cách viết lại định nghĩa của XOR thành: trả về true nếu hai toán hạng boolean không có cùng giá trị. Chúng ta có thể thực hiện điều đó như thế này:

//XOR 
if(a != b) { 
    ... 
} 

//XNOR 
if(a == b) { 
    ... 
} 

Bây giờ, đây là ngắn hơn nhiều và quan trọng hơn, chỉ đánh giá ab một lần. Tuy nhiên, điều này chỉ hoạt động nếu cả hai ab là các toán tử. Nếu bạn muốn hỗ trợ các loại khác, bạn sẽ phải chuyển đổi chúng sang các phép toán luận đầu tiên:

//XOR 
if(!a != !b) { 
    ... 
} 

//XNOR 
if(!a == !b) { 
    ... 
} 
Các vấn đề liên quan