Toán tử ống đôi ( ||
) là gì?
Toán tử ống đôi ( ||
) là toán tử logicOR
. Trong hầu hết các ngôn ngữ, nó hoạt động theo cách sau:
- Nếu giá trị đầu tiên là
false
, nó sẽ kiểm tra giá trị thứ hai. Nếu nó true
, nó trở lại true
và nếu nó false
, nó trở lại false
.
- Nếu giá trị đầu tiên là
true
, nó luôn trả về true
, bất kể giá trị thứ hai là gì.
Về cơ bản, nó hoạt động như chức năng này:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Nếu bạn vẫn không hiểu, hãy nhìn vào bảng này:
| true false
------+---------------
true | true true
false | true false
Nói cách khác, nó chỉ sai khi cả hai giá trị đều sai.
JavaScript khác nhau như thế nào?
JavaScript hơi khác một chút, vì đó là ngôn ngữ được gõ lỏng lẻo . Trong trường hợp này, điều đó có nghĩa là bạn có thể sử dụng ||
toán tử với các giá trị không phải là booleans. Mặc dù nó không có ý nghĩa gì, bạn có thể sử dụng toán tử này với ví dụ một hàm và một đối tượng:
(function(){}) || {}
Chuyện gì xảy ra ở đó?
Nếu các giá trị không phải là boolean, JavaScript thực hiện chuyển đổi ngầm định thành boolean . Nó có nghĩa là nếu giá trị là falsey (ví dụ 0
, ""
, null
, undefined
(xem thêm caã caác giaá trõ falsey trong JavaScript )), nó sẽ được coi như false
; nếu không thì nó được coi là true
.
Vì vậy, ví dụ trên nên đưa ra true
, bởi vì hàm rỗng là sự thật. Vâng, nó không. Nó trả về hàm rỗng. Đó là bởi vì ||
toán tử của JavaScript không hoạt động như tôi đã viết lúc đầu. Nó hoạt động theo cách sau:
- Nếu giá trị đầu tiên là falsey , nó sẽ trả về giá trị thứ hai .
- Nếu giá trị đầu tiên là trung thực , nó sẽ trả về giá trị đầu tiên .
Ngạc nhiên? Trên thực tế, nó "tương thích" với ||
toán tử truyền thống . Nó có thể được viết như sau:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Nếu bạn vượt qua một giá trị trung thực như x
, nó trả về x
, đó là một giá trị trung thực. Vì vậy, nếu bạn sử dụng nó sau này trong if
mệnh đề:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
bạn nhận được "Either x or y is truthy."
.
Nếu x
là chim ưng, eitherXorY
sẽ là y
. Trong trường hợp này, bạn sẽ nhận được "Either x or y is truthy."
nếu y
là sự thật; nếu không bạn sẽ nhận được "Neither x nor y is truthy"
.
Câu hỏi thực tế
Bây giờ, khi bạn biết cách thức ||
vận hành, bạn có thể tự mình tìm ra x = x || y
ý nghĩa của nó. Nếu x
là sự thật, x
được giao cho x
, vì vậy thực sự không có gì xảy ra; mặt khác y
được gán cho x
. Nó thường được sử dụng để xác định các tham số mặc định trong các chức năng. Tuy nhiên, nó thường được coi là một thực tiễn lập trình xấu , bởi vì nó ngăn bạn truyền một giá trị falsey (không nhất thiết undefined
hoặc null
) như một tham số. Xem xét ví dụ sau:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Nó có vẻ hợp lệ ngay từ cái nhìn đầu tiên. Tuy nhiên, điều gì sẽ xảy ra nếu bạn chuyển qua false
làm flagA
tham số (vì nó là boolean, tức là có thể true
hoặc false
)? Nó sẽ trở thành true
. Trong ví dụ này, không có cách nào để thiết lập flagA
để false
.
Nó sẽ là một ý tưởng tốt hơn để kiểm tra rõ ràng liệu flagA
là undefined
, như thế:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Mặc dù nó dài hơn, nó luôn hoạt động và dễ hiểu hơn.
Bạn cũng có thể sử dụng cú pháp ES6 cho các tham số chức năng mặc định , nhưng lưu ý rằng nó không hoạt động trong các trình duyệt cũ hơn (như IE). Nếu bạn muốn hỗ trợ các trình duyệt này, bạn nên dịch mã của mình bằng Babel .
Xem thêm Toán tử logic trên MDN .
falsy
, chứ không phải CHỈundefined
. Số lần tôi đã thấydoWeDoIt = doWeDoIt || true
, đủ để khiến tôi khóc. (tức làdoWeDoIt
sẽ không bao giờfalse
)