2012-02-13 11 views
5

Przeglądałem jeden z minowanych plików js wygenerowanych przez zamknięcie. Okazało się, że gdziekolwiek jestem sprawdzania równości zmiennej i ciąg podobnegoRedukcja ujemna instrukcji porównania

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

zamknięcie zastępuje go

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

Dlaczego ta modyfikacja zrobić? Czy jest tu jakaś przewaga wydajności?

Odpowiedz

5

[UPDATE: Zobacz @ Jana odpowiedzi, to ma większy sens, aby dlaczego minifier js byłoby to zrobić, i powinny być zaakceptowane odpowiedź]

Zgodnie z ogólną koncepcją, jest to, aby uniknąć błędu programisty . Jeśli ręcznie modyfikujesz kod i umieszczasz zmienną pierwszą i stałą sekundę, możesz przypadkowo wpisać:

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

Ups! Ustawiamy tylko a na '13' zamiast porównywać. Przez wprowadzenie stałej po lewej stronie, możemy uniknąć tej możliwości:

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

rzuci wyjątek, ponieważ nie można umieścić stały ciąg po lewej stronie operacji przypisania.

Tak więc w niektórych szkołach myślenia najlepiej jest zawsze umieszczać stałą po lewej stronie podczas porównywania równości ze stałą. Wygląda na to, że po tej praktyce następuje zamknięcie.

Są to tak zwane "warunki yoda".

Proszę zauważyć, że moje osobiste preferencje polegają na tym, aby w większości przypadków po prostu wstawiać stałą po prawej stronie, ponieważ kod ma tendencję do lepszego czytania, więc nie sądzę, aby kompromis był wystarczająco dobry. Ale widzę logikę stojącą za warunkami yody.

+0

To nie wyjaśnia, dlaczego kompresor by to zrobił. OT: Czy rzeczywiście usunęli [wątek na temat warunków Yoda] (http://webcache.googleusercontent.com/search?q=cache:stackoverflow.com/questions/2349378/new-programming-jargon-you-coined+jargon+ ukuty) ?! – user123444555621

+0

Sprężarka wykorzystuje najlepsze praktyki, gdy tylko jest to możliwe, tylko dlatego, że może. (Offchance, że ktoś edytuje wersję minified może?) –

+0

Również, nie byłem świadomy tego wątku o warunkach yoda. Właśnie słyszałam, jak to wcześniej opisano. –

9

Dokonuje się tego dla mniejszej przewagi kompresji gzip. Jeśli masz "x == 1" i "1 == x", kompilator przełącza go na "1 == x" w obu przypadkach i dostajesz bardziej regularny kod, który lepiej kompresuje. Wygrana jest tak niewielka, że ​​rozważam usunięcie kodu i zapisanie cykli procesora, ale jest już na razie. Nie ma to nic wspólnego z zapobieganiem błędom programisty, ponieważ nigdy nie przełącza "x = 2" na "2 = x", ponieważ to zmieniłoby znaczenie programu.

+1

To ma sens. OP (@ user843241) powinien zmienić to na akceptowaną odpowiedź. Usunąłbym własną odpowiedź, ale nie wiem, czy to byłoby koszerne. Chociaż tylko dla zapisu, warunki Yoda nigdy nie mówią nic o kolejności operandów na zlecenie; Oczywiście nigdy nie zmienisz "x = 2" na "2 = x". Warunki Yoda są o porządku operandów tylko na porównaniu równości. –