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-circuitvớ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 expr1và 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
expr1có 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 resgiá 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 NaNexpr1trở 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ư NaNlà falsy)userinputnó là sự thật (một con số), tôi có thể thêm +5vào nóVì vậy, ở đây, chúng tôi có thể tránh các ifkhối bổ sung và isNaNkiể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à falseexpr1 Là true || falseVì 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 || expr2trong expr1đánh giá là đúng, expr1thì 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()
*/
expr1và expr2 hay condition1hay 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+%slàm lối tắt tìm kiếm (Chrome / Firefox) để tăng tốc độ tìm kiếm.