Javacript sử dụng đánh giá ngắn mạch cho các toán tử logic ||
và &&
. Tuy nhiên, nó khác với các ngôn ngữ khác ở chỗ nó trả về kết quả của giá trị cuối cùng đã tạm dừng thực thi, thay vì a true
hoặc false
giá trị.
Các giá trị sau được coi là giả trong JavaScript.
- sai
- vô giá trị
""
(chuỗi trống)
- 0
- Nan
- chưa xác định
Bỏ qua các quy tắc ưu tiên toán tử và giữ cho mọi thứ đơn giản, các ví dụ sau đây cho thấy giá trị nào đã dừng đánh giá và được trả về kết quả.
false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"
5 giá trị đầu tiên NaN
trở lên là sai lệch vì vậy tất cả chúng được đánh giá từ trái sang phải, cho đến khi nó đáp ứng giá trị trung thực đầu tiên - "Hello"
làm cho toàn bộ biểu thức là đúng, do đó, mọi giá trị tiếp theo sẽ không được đánh giá và "Hello"
được trả về do kết quả của biểu thức . Tương tự, trong trường hợp này:
1 && [] && {} && true && "World" && null && 2010 // null
5 giá trị đầu tiên đều là sự thật và được đánh giá cho đến khi nó đáp ứng giá trị null
giả mạo đầu tiên ( ) làm cho biểu thức sai, do đó 2010
không được đánh giá nữa và null
được trả về do kết quả của biểu thức.
Ví dụ bạn đã đưa ra là sử dụng thuộc tính JavaScript này để thực hiện một bài tập. Nó có thể được sử dụng bất cứ nơi nào mà bạn cần để có được giá trị trung thực hoặc giả đầu tiên trong số các giá trị. Mã này dưới đây sẽ gán giá trị "Hello"
đến b
khi nó làm cho nó dễ dàng hơn để gán một giá trị mặc định, thay vì làm if-else kiểm tra.
var a = false;
var b = a || "Hello";
Bạn có thể gọi ví dụ dưới đây là khai thác tính năng này và tôi tin rằng nó làm cho mã khó đọc hơn.
var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);
Bên trong cảnh báo, chúng tôi kiểm tra xem có phải messages
là giả hay không, và nếu có, sau đó đánh giá và trả lại noNewMessagesText
, nếu không thì đánh giá và trả lại newMessagesText
. Vì nó sai trong ví dụ này, chúng tôi dừng lại ở noNewMessagesText và cảnh báo "Sorry, you have no new messages."
.
$f=$a or $f=$b or $f=$c; // etc
. PHP có cả||
toán tử vàor
toán tử, thực hiện cùng một công việc; tuy nhiênor
được đánh giá sau khi gán trong khi||
được đánh giá trước. Điều này cũng mang đến cho bạn phong cách hoàn hảo của$a=getSomething() or die('oops');