Câu hỏi Có một javascript nếu tuyên bố với nhiều điều kiện kiểm tra tất cả chúng?


Trong javascript, khi sử dụng câu lệnh if với nhiều điều kiện để kiểm tra, javascript có kiểm tra tất cả chúng không phân biệt hay nó sẽ bảo lãnh trước khi kiểm tra tất cả nếu nó đã sai?

Ví dụ:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

Javascript sẽ kiểm tra cho tất cả 3 của những điều kiện hoặc, sau khi thấy rằng b không bằng 1, và do đó là sai, nó sẽ thoát khỏi tuyên bố?

Tôi hỏi từ quan điểm hiệu suất. Nếu, ví dụ, tôi đang thử nghiệm 3 bộ chọn jQuery phức tạp Tôi không muốn có jQuery đi qua DOM 3 lần nếu nó hiển nhiên qua đầu tiên mà nó sẽ trả về FALSE. (Trong trường hợp đó sẽ có ý nghĩa hơn để lồng 3 nếu các câu lệnh).

THÊM: Thêm một sự tò mò, thuật ngữ thích hợp cho điều này là gì? Tôi nhận thấy rằng nhiều bạn sử dụng thuật ngữ 'ngắn mạch'. Ngoài ra, làm một số ngôn ngữ làm điều này và những người khác không?


76
2017-12-18 20:26


gốc


@ Josh: Tôi hoàn toàn đánh giá cao ý tưởng rằng đây là tối ưu hóa vi mô. Điều nào là tốt để biết. Điều đó nói rằng nếu một tùy chọn được tối ưu hóa hơn một tùy chọn khác, tôi cho rằng nó là tốt để biết và nhận được trong thói quen sử dụng phương pháp nói. (Thêm nữa, tôi cũng rất tò mò về câu trả lời) - DA.
Nói đúng ra, đây không phải là tối ưu hóa sớm. Trong các ngôn ngữ có logic mạch ngắn, điều quan trọng là phải biết trong điều kiện nào một số phương thức sẽ không được thực thi; nếu bạn đang dựa vào tác dụng phụ của họ, ví dụ. - Rob
Đây là một câu hỏi khác về "đánh giá ngắn mạch": stackoverflow.com/questions/1232603/… - David
@David. Cảm ơn! Thú vị đọc sách. - DA.


Các câu trả lời:


Các && toán tử "ngắn mạch" - nghĩa là, nếu điều kiện trái là sai, nó không làm phiền việc đánh giá đúng.

Tương tự, || ngắn mạch điều hành nếu điều kiện bên trái là đúng.

EDIT: Mặc dù, bạn không nên lo lắng về hiệu suất cho đến khi bạn đã đo điểm chuẩn và xác định rằng đó là một vấn đề. Tối ưu hóa vi mô sớm là lệnh cấm bảo trì.


112
2017-12-18 20:28



Câu trả lời xuất sắc (cả phần kỹ thuật và vấn đề quản lý). cảm ơn! - DA.
Nếu bạn muốn nó thực hiện tất cả các phần của boolean statment, bạn có thể sử dụng & và | cho và và hoặc lặp lại - Zoidberg
Tình trạng này không nhất thiết phải luôn luôn về hiệu suất. Đôi khi bạn có thể kiểm tra null và nói nếu kiểm tra null của bạn là điều kiện a và sau đó bạn cố gắng thực hiện (b == value + 1) cho lần kiểm tra thứ hai, bạn sẽ gặp lỗi nếu cả ba điều kiện nếu điều kiện được kiểm tra. - infocyde
Thật vậy, ngắn mạch không phải là về hiệu suất. Câu hỏi ban đầu, tuy nhiên, đã được hỏi từ một quan điểm hiệu suất. - Anon.
rất tốt. Việc thực hiện loại tối ưu hóa vi mô này (trong số những thứ khác) có thể có tác động lớn bên trong vòng lặp sự kiện cuộn, cho phép nói tính toán thị sai của nhiều phần tử cho ví dụ hoặc thậm chí thanh dán. lấy ví dụ này: if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop) điều kiện thứ hai là một tính toán đắt tiền hơn, điều đầu tiên chỉ là một boolean. :) - antoni


Từ quan điểm hiệu suất, đây không phải là tối ưu hóa vi mô.

Nếu chúng ta có 3 biến Boolean, a, b, c là một tối ưu hóa vi mô.

Nếu chúng ta gọi 3 hàm trả về các biến Boolean, mỗi hàm có thể mất một thời gian dài, và không chỉ quan trọng là phải biết các mạch ngắn này, mà theo thứ tự nào. Ví dụ:

if (takesSeconds () && takesMinutes ())

tốt hơn nhiều

if (takesMinutes () && takesSeconds ())

nếu cả hai đều có khả năng trả về sai.


11
2017-12-18 21:21





Đó là lý do tại sao bạn có thể làm trong mã javascript như

var x = x || 2;

Điều đó có nghĩa là nếu x không xác định hoặc ngược lại thì 'false' thì giá trị mặc định là 2.


9
2017-12-18 20:32



Điều này có thể hoạt động ngay cả khi JS không hỗ trợ đánh giá ngắn mạch. - p.s.w.g
Đây có phải là tương đương với một ternary? - Mark Carpenter Jr


Trong trường hợp ai đó tự hỏi liệu có cách nào để buộc đánh giá của tất cả các điều kiện, trong vài trường hợp các toán tử bitwise & và | có thể được sử dụng

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

Chúng nên được sử dụng thực sự cẩn thận bởi vì các toán tử bitwise là toán tử số học hoạt động trên các bit đơn của toán hạng của chúng và không thể luôn hoạt động như phiên bản "không ngắn mạch" của && và || 

Thí dụ:

-2147483648 && 1 = 1 

nhưng

-2147483648 & 1 = 0

Hy vọng nó sẽ giúp một người đến đây tìm kiếm thông tin như thế này (như tôi) và nhờ vào @Max để sửa và ví dụ ngược lại


9
2017-09-21 10:33



Câu trả lời này là sai. & và | là toán tử bitwise, chúng KHÔNG phải là các phiên bản không ngắn mạch của && và || '. Các toán tử bitwise là toán tử số học hoạt động trên các bit đơn của toán hạng của chúng. Ví dụ: -2147483648 && 1 = 1 nhưng -2147483648 & 1 = 0. Thông tin thêm tại đây: en.wikipedia.org/wiki/Bitwise_operation - Max
@Max thực sự tôi không biết điều này, tôi đã sử dụng này (những gì tôi bây giờ gọi là "lừa") kể từ khi tôi đã học C. May mắn như vậy đầu vào mà có thể đã phá vỡ mã của tôi không bao giờ xuất hiện. Tôi đã sửa lại câu trả lời, tôi nợ bạn - ivcandela
cảm ơn bạn đã sửa câu trả lời :-) - Max
@DJDaveMark xin lỗi tôi không thể có được của bạn false && (alert("")) giải pháp để làm việc: / - ivcandela
@ivcandela Không thể I. Nếu tôi không ở trên điện thoại của mình, tôi đã thử nghiệm nó lần đầu tiên; o) Tiếc là bạn không thể chỉnh sửa bình luận. Tôi vừa xóa nó và thêm một mục khác bên dưới - DJDaveMark


Nó sẽ chỉ kiểm tra tất cả các điều kiện nếu điều kiện đầu tiên là đúng, kiểm tra nó cho chính bạn:

javascript: alert (false && alert("A") && false);

7
2017-12-18 20:29





Nó ngắn mạch - chỉ a và b sẽ được so sánh trong ví dụ của bạn.


3
2017-12-18 20:29





Nó thoát sau khi thấy rằng b không bằng một.


2
2017-12-18 20:28