2012-02-13 27 views
5

Tôi đã xem qua một trong các tệp js được rút gọn được tạo bằng cách đóng. Tôi thấy rằng bất cứ nơi nào tôi đang kiểm tra sự bình đẳng giữa một biến và chuỗi như,Giảm thiểu Javascript của các báo cáo so sánh

a == "13" || a == "40" 

đóng cửa thay thế nó bằng

"13" == a || "40" == a 

Tại sao sửa đổi này được thực hiện? Có một số lợi thế về hiệu suất ở đây không?

Trả lời

5

[UPDATE: Xem @ câu trả lời của John, nó có ý nghĩa hơn là tại sao một minifier js sẽ làm điều này, và nên là câu trả lời chấp nhận]

Là một khái niệm chung, đây là để tránh lỗi lập trình viên . Nếu bạn đã sửa đổi mã theo cách thủ công và đặt biến đầu tiên và không đổi thứ hai, bạn có thể vô tình nhập:

a == '40' || a = '13' 

Rất tiếc! Chúng tôi chỉ đặt a thành '13' thay vì so sánh. Bằng cách đặt hằng số ở bên trái, chúng tôi tránh khả năng này:

'40' == a || '13' = a 

Sẽ ném một ngoại lệ vì bạn không thể đặt chuỗi liên tục trên tay trái của thao tác gán.

Vì vậy, trong một số trường phái tư tưởng, cách tốt nhất là luôn đặt hằng số ở bên trái khi so sánh bình đẳng so với hằng số. Hình như việc đóng cửa theo sau sự thực hành đó.

Đây được gọi là "điều kiện yoda". Lưu ý rằng sở thích cá nhân của tôi là thực sự chỉ cần đặt hằng số ở bên phải trong hầu hết các trường hợp, bởi vì mã có xu hướng đọc tốt hơn, vì vậy tôi không nghĩ rằng sự cân bằng là đủ tốt. Nhưng tôi thấy logic đằng sau điều kiện yoda.

+0

Điều đó không giải thích tại sao máy nén sẽ làm điều đó. OT: Họ có thực sự xóa [luồng trên điều kiện Yoda] không (http://webcache.googleusercontent.com/search?q=cache:stackoverflow.com/questions/2349378/new-programming-jargon-you-coined+jargon+ đặt ra) ?! – user123444555621

+0

Máy nén sử dụng các phương pháp hay nhất bất cứ khi nào có thể, chỉ vì có thể. (Offchance rằng ai đó chỉnh sửa phiên bản minified có thể?) –

+0

Ngoài ra, tôi đã không nhận thức được rằng thread về điều kiện yoda. Tôi vừa nghe điều này được mô tả theo cách đó trước đây. –

9

Điều này được thực hiện vì lợi ích nén gzip nhỏ. Nếu bạn có "x == 1" và "1 == x" trình biên dịch sẽ chuyển nó thành "1 == x" trong cả hai trường hợp và bạn nhận được mã thường xuyên hơn để nén tốt hơn. Việc giành chiến thắng là rất nhỏ, mà tôi đã xem xét việc xóa mã và tiết kiệm các chu kỳ CPU, nhưng nó là trên cho bây giờ. Nó không liên quan gì đến việc ngăn chặn các lỗi lập trình vì nó sẽ không bao giờ chuyển đổi "x = 2" thành "2 = x" vì điều đó sẽ thay đổi ý nghĩa của chương trình.

+1

Làm cho tinh thần. OP (@ user843241) sẽ thay đổi điều này thành câu trả lời được chấp nhận. Tôi sẽ xóa câu trả lời của riêng mình nhưng tôi không biết liệu câu trả lời đó có phải là kosher hay không. Mặc dù chỉ cho hồ sơ, Yoda Điều kiện không bao giờ nói bất cứ điều gì về thứ tự của toán hạng trên nhiệm vụ; tất nhiên bạn sẽ không bao giờ thay đổi "x = 2" thành "2 = x". Điều kiện Yoda là về thứ tự các toán hạng chỉ so sánh bình đẳng. –

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