Tôi muốn biết JavaScript có đánh giá "ngắn mạch" như Toán tử && trong C # hay không. Nếu không, tôi muốn biết liệu có giải pháp nào phù hợp để áp dụng không.
Tôi muốn biết JavaScript có đánh giá "ngắn mạch" như Toán tử && trong C # hay không. Nếu không, tôi muốn biết liệu có giải pháp nào phù hợp để áp dụng không.
Câu trả lời:
Có, JavaScript có đánh giá "ngắn mạch".
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
Short-circuit
với toán tử logic đó. Chỉ cần thử nó cho mình. Sử dụng bản demo của tôi.
Câu trả lời này đi sâu vào chi tiết về cách đoản mạchhoạt động trong JavaScript, với tất cả các chủ đề có liên quan và cũng như quyền ưu tiên của toán tử, nếu bạn đang tìm kiếm một định nghĩa nhanh và đã hiểu cách hoạt động của hiện tượng đoản mạch, tôi khuyên bạn nên kiểm tra các câu trả lời khác.
Trước tiên, hãy kiểm tra hành vi mà tất cả chúng ta đều quen thuộc, bên trong if()
khối, nơi chúng ta sử dụng &&
để kiểm tra xem hai thứ có phải là true
:
if (true && true) {
console.log('bar');
}
Bây giờ, bản năng đầu tiên của bạn có lẽ là nói: 'À vâng, khá đơn giản, mã thực thi câu lệnh nếu cả hai expr1
và expr2
được đánh giá là true
'
Vâng, có và không. Bạn nói đúng về mặt kỹ thuật, đó là hành vi bạn đã mô tả, nhưng đó không chính xác là cách mã được đánh giá và chúng tôi sẽ cần nghiên cứu sâu hơn để hiểu đầy đủ.
&&
và được ||
giải thích như thế nào ?:Đã đến lúc xem xét "dưới mui xe của javascript engine ". Hãy xem xét ví dụ thực tế này:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
Kết quả là 260
.. nhưng tại sao? Để có câu trả lời, chúng ta cần hiểu cách đánh giá ngắn mạch hoạt động như thế nào.
Theo Định nghĩa MDN ,
&&
toán tử trongexpr1 && expr2
được thực thi như sau:Nếu
expr1
có thể được chuyển đổi thànhtrue
, trả vềexpr2
; khác, trả vềexpr1
.
Vì vậy, điều này có nghĩa là, trong ví dụ thực tế của chúng tôi, const res
giá trị được đánh giá theo cách sau:
expr1
-sanitise(0xFF)
0xFF
là một số thập lục phân hợp lệ cho 250, nếu không, tôi sẽ trả lại NaN
expr1
trở một "truthy" giá trị, thời gian để thực hiện expr2
(nếu không tôi sẽ dừng lại như NaN
là falsy)userinput
nó là sự thật (một con số), tôi có thể thêm +5
vào nóVì vậy, ở đây, chúng tôi có thể tránh các if
khối bổ sung và isNaN
kiểm tra thêm bằng cách sử dụng &&
toán tử đơn giản .
Bây giờ, ít nhất chúng ta nên có một bức tranh về cách ngắn mạchcác nhà điều hành hoạt động. Quy tắc chung là:
(some falsy expression) && expr
sẽ đánh giá thành biểu hiện giả dối(some truthy expression) || expr
sẽ đánh giá biểu hiện trung thựcDưới đây là một số ví dụ khác để hiểu rõ hơn:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
Tốt, hy vọng bạn hiểu được nó! Điều cuối cùng chúng ta cần biết là một quy tắc về ưu tiên toán tử, đó là:
&&
nhà điều hành luôn được thực hiện trước khi các ||
nhà điều hành.Hãy xem xét ví dụ sau:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
Điều này sẽ trả về, có lẽ gây nhầm lẫn cho một số như a()
. Lý do khá đơn giản, chỉ là thị giác của chúng ta đang đánh lừa chúng ta, bởi vì chúng ta đã quen với việc đọc từ trái sang phải. Hãy xem xét console.log()
những điều được và không được và tập trung hoàn toàn vào đánh giá
true || false && false
Bây giờ để quấn lấy đầu của bạn xung quanh điều này:
Chúng tôi đã nói rằng &&
nhà điều hành có quyền ưu tiên, vì vậy nó được đánh giá là đầu tiên. Để giúp chúng ta hình dung rõ hơn về việc đánh giá, hãy nghĩ đến định nghĩa
expr1 && expr2
Ở đâu:
expr2
Là false
expr1
Là true || false
Vì vậy, đó là phần khó khăn, bây giờ true || false
được đánh giá (phía expr1
- bên trái của &&
).
||
toán tử dừng thực thi nếu expr1 || expr2
trong expr1
đánh giá là đúng, expr1
thì toán tử được thực thi và thực thi mã dừng.Giá trị trả về là true
Chà .. điều đó khá phức tạp, tất cả chỉ vì một vài quy tắc và ngữ nghĩa kỳ lạ. Nhưng hãy nhớ, bạn luôn có thể thoát khỏi ưu tiên toán tử với ()
- giống như trong toán học
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
và expr2
hay condition1
hay bất cứ điều gì, mà chỉ là khó hiểu. Quyết định cho một, bạn cũng có thể giới thiệu các biến cục bộ, ví dụ. const expr1 = true; if(expr1 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
làm lối tắt tìm kiếm (Chrome / Firefox) để tăng tốc độ tìm kiếm.