2011-08-07 38 views
40

tôi thấy somewhere khác nói,"x && foo()" là gì?

x && foo();

bằng

if(x){ 
    foo(); 
} 

Tôi đã thử nghiệm nó và họ thực sự đã làm điều tương tự.
Nhưng tại sao? Chính xác là x && foo() là gì?

+28

Mặc dù đây là mẹo nhỏ nhưng tôi hy vọng bạn không sử dụng nó. Nó hoạt động nhưng nó được coi là hình thức xấu. –

+4

Vâng, tôi đồng ý với @PortableWorld. 'if (x) {foo();}' hoặc thậm chí 'if (x) foo();' trên một dòng đơn sẽ chỉ là dễ hiểu, sử dụng tổng quát hơn. – Kzqai

+4

Nhưng hãy cẩn thận để không nhầm lẫn điều này với 'if (x && foo()) {...}' được chấp nhận và có ý nghĩa khác. Tôi, đối với một, không nhớ 'x && foo()', đặc biệt là nếu những thứ như thế này leo lên rất nhiều ... JS lợi ích từ việc giảm thiểu. – vol7ron

Trả lời

64

Cả hai toán tử AND và OR đều có thể tắt.

Vì vậy, && chỉ thử biểu thức thứ hai nếu cụm từ đầu tiên là đúng (giống như thật, cụ thể hơn). Thực tế là hoạt động thứ hai thực hiện công cụ (bất kể nội dung của foo() nào) không quan trọng bởi vì nó không được thực hiện trừ khi biểu thức đầu tiên đó đánh giá một cái gì đó trung thực. Nếu nó là sự thật, sau đó sẽ được thực hiện để thử nghiệm thứ hai.

Ngược lại, nếu cụm từ đầu tiên trong câu lệnh || là đúng, câu thứ hai sẽ không được chạm vào. Điều này được thực hiện vì toàn bộ câu lệnh có thể đã được đánh giá, câu lệnh sẽ kết quả là true bất kể kết quả của biểu thức thứ hai, vì vậy nó sẽ bị bỏ qua và vẫn chưa được thực thi. Ví dụ:

Các trường hợp cần lưu ý khi sử dụng các phím tắt, trong đó các biến được xác định vẫn đánh giá thành giá trị sai (ví dụ: 0) và các giá trị trung thực (ví dụ: 'zero').

+3

Kiểm tra đặc tả cú pháp của ngôn ngữ của bạn để đảm bảo rằng ngôn ngữ của bạn tuân thủ cùng một quy tắc chấm dứt thực thi lối tắt. Ngôn ngữ cũ tồn tại vi phạm nó. –

+0

Trên thực tế, tại Delphi bạn có thể tắt nó cho toàn bộ dự án, một tập tin cụ thể, hoặc thậm chí xung quanh một chức năng nào đó .. Crazy stuff :) http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN /html/devcommon/compdirsbooleanshortcircuitevaluation_xml.html –

+5

@ John: Câu hỏi chỉ định javascript… –

3

Trong javascript, toán tử && đánh giá từ trái sang phải và trả về giá trị của thao tác ngoài cùng bên phải. Nếu điều kiện đầu tiên đánh giá sai, nó sẽ không đánh giá điều kiện thứ hai. Vì vậy, một cách viết tắt của câu nói "nếu một cái gì đó không phải là null hoặc không xác định, làm điều gì đó"

24

Điều này được gọi là short-circuit evaluation.

Trong trường hợp này, nếu x là False thì foo() không cần được đánh giá (kết quả của && sẽ luôn là Sai); nếu x là True, nó cần phải được đánh giá (ngay cả khi kết quả bị vứt bỏ).

+0

Ah, bài viết wikipedia chắc chắn bao gồm tất cả. Như mọi khi. – Kzqai

+4

@ Tchalvak: Nó ... nếu bạn biết cần tìm gì! – Johnsyweb

2

Nó ngắn mạch.

Nhà điều hành && hoạt động như thế này: Nó hợp lý hoặc của hai toán hạng ở cả hai bên. Nếu phía bên tay trái có giá trị khác 0 thì phần bên phải được đánh giá để xác định giá trị chân lý. Nếu phía bên tay trái bằng không thì bất cứ mặt nào bên phải, biểu thức sẽ đánh giá là 0, do đó phía bên tay phải là không phải là được đánh giá. Vì vậy, nếu có, nếu x khác 0 thì chỉ có foo được gọi và nếu x là 0 thì foo không được gọi và do đó, nó hoạt động như if - else trong trường hợp này.

8

Nó không chính xác tương đương. Cái đầu tiên là một biểu thức với một giá trị trả về mà bạn có thể sử dụng; thứ hai là một tuyên bố.

Nếu bạn không quan tâm đến giá trị trả về (tức là thông tin cho dù cả hai xfoo() đánh giá giá trị trung thực), chúng đều tương đương, nhưng thông thường, bạn chỉ nên sử dụng phiên bản logic boolean nếu bạn muốn sử dụng nó như một biểu thức boolean, ví dụ:

if (x && foo()) { 
    do_stuff(); 
} 

Nếu bạn chỉ quan tâm trong việc điều hành foo() có điều kiện (khi x là truthy), hình thức thứ hai là được ưa thích, vì nó truyền tải được ý định rõ ràng hơn.

Lý do mọi người có thể thích phiên bản logic boolean có thể là javascript bị hạn chế bất thường: kích thước mã nguồn (nhiều mã nguồn dài hơn nghĩa là sử dụng băng thông nhiều hơn); vì phiên bản logic boolean sử dụng ít ký tự hơn nên hiệu quả băng thông cao hơn. Tôi vẫn thích phiên bản chi tiết hơn, trừ khi kịch bản được đề cập được sử dụng nhiều - cho một thư viện như jQuery, sử dụng tối ưu hóa như thế này là hoàn toàn hợp lý, nhưng trong hầu hết các trường hợp khác thì không.

Các vấn đề liên quan