Có ba toán tử logic trong JavaScript: ||
(OR), &&
(AND), !
(NOT).
Mặc dù chúng được gọi là logic, nhưng chúng có thể được áp dụng cho các giá trị thuộc bất kỳ kiểu nào, không chỉ boolean.
Chúng ta hãy xem chi tiết.
Nội dung chính
1. | | (HOẶC LÀ)
Toán tử OR được thể hiện bằng hai ký hiệu đường thẳng đứng:
result = a || b;
Trong lập trình cổ điển, OR logic có nghĩa là chỉ thao tác các giá trị boolean. Nếu bất kỳ đối số của nó là true
, nó trả về true
, nếu không nó trả về false
.
Trong JavaScript, toán tử phức tạp hơn một chút và mạnh hơn. Nhưng trước tiên, hãy xem điều gì xảy ra với các giá trị boolean.
Có bốn kết hợp logic sau:
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
Như chúng ta có thể thấy, kết quả luôn luôn true
ngoại trừ trường hợp khi cả hai toán hạng đều false
.
Nếu một toán hạng không phải là boolean, nó sẽ được chuyển đổi thành boolean để đánh giá.
Chẳng hạn, số 1
được coi là true
, số 0
như false
:
if (1 || 0) { // works just like if( true || false )
alert( 'truthy!' );
}
Hầu hết thời gian, OR ||
được sử dụng trong câu lệnh if
để kiểm tra nếu bất kỳ điều kiện nào được đưa ra true
.
Ví dụ:
let hour = 9;
if (hour < 10 || hour > 18) {
alert( 'The office is closed.' );
}
Chúng ta có thể vượt qua nhiều điều kiện hơn:
let hour = 12;
let isWeekend = true;
if (hour < 10 || hour > 18 || isWeekend) {
alert( 'The office is closed.' ); // it is the weekend
}
2. HOẶC | | tìm thấy giá trị đúng đầu tiên
Logic được mô tả ở trên là hơi cổ điển. Bây giờ, chúng ta hãy mang đến các tính năng bổ sung trên JavaScript.
Thuật toán mở rộng hoạt động như sau.
Cho nhiều giá trị OR:
result = value1 || value2 || value3;
||
Toán tử OR thực hiện như sau:
- Đánh giá toán hạng từ trái sang phải.
- Đối với mỗi toán hạng, chuyển đổi nó thành boolean. Nếu kết quả là
true
, dừng và trả về giá trị đầu của toán hạng đó. - Nếu tất cả các toán hạng đã được ước tính (tức là tất cả đều được
false
), trả về toán hạng cuối cùng.
Một giá trị được trả về ở dạng đầu, không có chuyển đổi.
Nói cách khác, một chuỗi OR "||"
trả về giá trị đúng thực đầu tiên hoặc cái cuối cùng trong chuỗi nếu không tìm thấy giá trị đúng.
Ví dụ:
alert( 1 || 0 ); // 1 (1 is truthy)
alert( null || 1 ); // 1 (1 is the first truthy value)
alert( null || 0 || 1 ); // 1 (the first truthy value)
alert( undefined || null || 0 ); // 0 (all falsy, returns the last value)
Điều này dẫn đến một số cách sử dụng thú vị so với một OR cơ bản, cổ điển.
Lấy giá trị đúng đầu tiên từ danh sách các biến hoặc biểu thức.
Ví dụ, chúng ta có các biến firstName
, lastName
và nickName
, tất cả các tùy chọn. Hãy sử dụng HOẶC ||
để chọn dữ liệu có dữ liệu và hiển thị dữ liệu đó (hoặc anonymous
nếu không có gì được đặt):
let firstName = ""; let lastName = ""; let nickName = "SuperCoder"; alert( firstName || lastName || nickName || "Anonymous"); // SuperCoder
Nếu tất cả các biến là sai, Anonymous
sẽ hiển thị.
Đánh giá ngắn mạch.
Một tính năng khác của ||
toán tử OR là đánh giá được gọi là ngắn mạch.
Nó có nghĩa là ||
xử lý các đối số của nó cho đến khi đạt được giá trị đúng đầu tiên, và sau đó giá trị được trả về ngay lập tức, thậm chí không chạm vào đối số khác.
Tầm quan trọng của tính năng này trở nên rõ ràng nếu toán hạng không chỉ là một giá trị, mà là một biểu thức có tác dụng phụ, chẳng hạn như gán biến hoặc gọi hàm.
Trong ví dụ dưới đây, tin nhắn đầu tiên được in, trong khi tin nhắn thứ hai thì không:
true || alert("printed");
false || alert("not printed");
Trong dòng đầu tiên, ||
toán tử OR dừng đánh giá ngay khi nhìn thấy true
, do đó, alert
không chạy. Đôi khi, mọi người sử dụng tính năng này để thực thi các lệnh chỉ khi điều kiện ở phần bên trái là đúng.
3. && (VÀ)
Toán tử AND được biểu diễn bằng hai ký hiệu &&
:
result = a && b;
Trong lập trình cổ điển, AND trả về true
nếu cả hai toán hạng là đúng và false
ngược lại:
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false
Một ví dụ với if
:
let hour = 12;
let minute = 30;
if (hour == 12 && minute == 30) {
alert( 'The time is 12:30' );
}
Cũng như với OR, mọi giá trị đều được phép so sánh dưới dạng toán hạng AND:
if (1 && 0) { // evaluated as true && false
alert( "won't work, because the result is falsy" );
}
4. VÀ && Tìm thấy giá trị sai đầu tiên
Cho nhiều giá trị AND:
result = value1 && value2 && value3;
&&
Toán tử AND thực hiện như sau:
- Đánh giá toán hạng từ trái sang phải.
- Đối với mỗi toán hạng, chuyển đổi nó thành một boolean. Nếu kết quả là
false
, dừng và trả về giá trị ban đầu của toán hạng đó. - Nếu tất cả các toán hạng đã được đánh giá (tức là tất cả đều là đúng), trả về toán hạng cuối cùng.
Nói cách khác, AND trả về giá trị giả đầu tiên hoặc giá trị cuối cùng nếu không tìm thấy.
Các quy tắc trên tương tự như OR. Sự khác biệt là AND trả về giá trị false đầu tiên trong khi OR thì trả về giá trị đúng đầu tiên.
Ví dụ:
/*
Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
@author cafedevn
Contact: cafedevn@gmail.com
Fanpage: https://www.facebook.com/cafedevn
Instagram: https://instagram.com/cafedevn
Twitter: https://twitter.com/CafedeVn
Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
*/
// if the first operand is truthy,
// AND returns the second operand:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5
// if the first operand is falsy,
// AND returns it. The second operand is ignored
alert( null && 5 ); // null
alert( 0 && "no matter what" ); // 0
Chúng ta cũng có thể vượt qua một số giá trị liên tiếp. Xem làm thế nào một sai lầm đầu tiên được trả lại:
alert( 1 && 2 && null && 3 ); // null
Khi tất cả các giá trị là đúng, giá trị cuối cùng được trả về:
alert( 1 && 2 && 3 ); // 3, the last one
Ưu tiên của AND &&
cao hơn OR||
Ưu tiên của toán tử &&
AND cao hơn OR ||
.
Vì vậy, code a && b || c && d
về cơ bản giống như khi các &&
biểu thức nằm trong ngoặc đơn : (a && b) || (c && d)
.
Đừng thay thế if
bằng | | hoặc là &&
Đôi khi, mọi người sử dụng toán tử &&
AND như là “viết ngắn hơn if
“.
Ví dụ:
let x = 1;
(x > 0) && alert( 'Greater than zero!' );
Hành động trong phần bên phải &&
sẽ chỉ thực hiện nếu đánh giá đạt được. Đó là, chỉ khi (x > 0)
là đúng.
Vì vậy, về cơ bản chúng ta có một tương tự là:
let x = 1;
if (x > 0) alert( 'Greater than zero!' );
Mặc dù, biến thể &&
xuất hiện ngắn hơn, if
rõ ràng hơn và có xu hướng dễ đọc hơn một chút. Vì vậy, chúng ta khuyên bạn nên sử dụng mọi cấu trúc cho mục đích của nó: sử dụng if
nếu chúng ta muốn If và sử dụng &&
nếu chúng ta muốn AND.
5. ! (KHÔNG PHẢI)
Toán tử boolean NOT được biểu thị bằng dấu chấm than !
.
Cú pháp khá đơn giản:
result = !value;
Toán tử chấp nhận một đối số duy nhất và thực hiện như sau:
- Chuyển đổi toán hạng thành kiểu boolean :
true/false
. - Trả về giá trị nghịch đảo.
Ví dụ:
alert( !true ); // false
alert( !0 ); // true
!!
Đôi khi KHÔNG được sử dụng để chuyển đổi một giá trị thành kiểu boolean:
alert( !!"non-empty string" ); // true
alert( !!null ); // false
Nghĩa là, cái đầu tiên NOT chuyển đổi giá trị thành boolean và trả về nghịch đảo, và cái thứ hai NOT đảo ngược nó một lần nữa. Cuối cùng, chúng ta có một chuyển đổi giá trị thành boolean một cách đơn giản.
Có một cách dài dòng hơn để làm điều tương tự – một hàm Boolean
:
alert( Boolean("non-empty string") ); // true
alert( Boolean(null) ); // false
Ưu tiên của NOT !
là cao nhất trong tất cả các toán tử logic, vì vậy nó luôn luôn thực thi trước, trước &&
hoặc ||
.