2012-01-21 14 views
5

Pytanie: Czy kolejność operandów ma znaczenie przy ocenie równości lub tożsamości w JavaScript?Czy kolejność operandów ma znaczenie przy ocenie równości lub tożsamości w JavaScript?

W kodzie jest (0 == value) szybszy lub bardziej poprawny niż (value == 0)? (Należy zauważyć, że to pytanie jest równie ważne dla operatora tożsamości, ===.)

Ponieważ operatory równości i tożsamości są przemienne, nie uważam, że kolejność operandów powinna wpłynąć na wydajność oceny, chyba że jest coś nieodłącznego. korzyść z literału lewego po obliczeniu samego algorytmu równości. Jedynym powodem jest to, że zastanawiam Niedawno używane przez Google Closure Compiler się sprowadzać niektóre JavaScript, i zauważyłem, że

if (array.length == 0 && typeof length === 'number') {

zostały skompilowane do

if(0 == b.length && "number" === typeof c) {.

W obu wyrażeniach równości - jedno luźne i jedno ścisłe - zamknięcie odwróciło kolejność moich operandów, umieszczając Literał literalny i literał łańcuchowy po lewej stronie ich odpowiednich wyrażeń.

To mnie zainteresowało.

czytam przez Równość Operatorzy odcinku ECMAScript 5.1 Language Specification (sekcja 11.9, str. 80-82) i okazało się, że podczas gdy algorytmy równości zacząć od zbadania argumentów lewostronnego po pierwsze, nie ma żadnych oznak, że to szybciej lub lepiej użyć literału jako tego operandu.

Czy jest coś takiego w sprawdzaniu typów ECMAScript, które sprawia, że ​​badanie literałów jest optymalne? Czy może to być jakieś dziwactwo optymalizacji w kompilatorze zamknięcia? A może szczegół implementacji w starszej wersji algorytmu równości ECMAScript, który został unieważniony w nowszej wersji specyfikacji?

+1

myślę, że ten „błąd” jest jako efekt uboczny jak Google parserów i odbudowuje swój kod i nie ma nic wspólnego z objawów niepożądanych lub prawidłowego ness kolejność operandów – Raynos

+0

Aby sprawdzić szybkość, po prostu uruchom testy w [JS Perf] (http://jsperf.com). To oczywiście zmierzy tylko dostępne przeglądarki, które uruchamiają tworzone przez ciebie przypadki testowe, zamiast oferować teoretyczną/"obiektywną" ocenę. –

Odpowiedz

1

http://jsperf.com/lr-equality

nie mogę dać ci wyjaśnienia, ale można sprawdzić numery. Wydaje się, że są równi (teraz).

+0

Witam, mam interesującą teorię na temat operatorów "większych/mniej niż". Może to być interesujące, jeśli możesz je dodać. np. < 5 and 5 > a' – ajax333221

+0

Liczby są nieporównywalne, więc po prostu spójrz na nieprzetworzone dane: http: // jsperf.com/lr-equality – Blender

+0

Dzięki za sprawdzenie. Przeprowadziłem też testy wydajności, ale zastanawiałem się, czy istnieje algorytmiczny powód różnicy, ponieważ może to wskazywać na większy trend w wydajności JavaScriptu. Zasadniczo próbuję ustalić, czy istnieje przyczyna powodująca różnice w wydajności i czy mogę uzyskać inne korzyści związane z wydajnością, zmieniając nawyk. Ale doceniam wkład! – piersadrian

2

Dużo czasu ludzie kodują zmienną po prawej stronie jako konwencję stylu. Główny powód, dla którego może złapać błędy z niechlujnym kodowaniem.

Poniższy kod jest najprawdopodobniej błędem, ale instrukcja if zostanie uznana za poprawną.

if(n = 1) { } 

a to wygeneruje błąd

if(1 = n) { } 
+2

@PiersMainwaring Nie powiedział, że wartość jest prawdziwa * ponieważ * błędu - powiedział, że kiedy jest napisane, zazwyczaj * jest * błędem i celem było porównanie (w przeciwieństwie do zadania). Odpowiada na twoje pytanie: nie jest to działanie, jest sposobem na zmniejszenie klasy błędów. –

+0

@DaveNewton Ah, zrozumiano. Skoncentrowałem się na kwestii równości i źle odczytałem odpowiedź. Przepraszam. – piersadrian

+0

Co oznacza, że ​​kompilator zamykania może być również narzędziem do kontroli jakości? – katspaugh

Powiązane problemy