Bawiłem się w jsfiddle.net i jestem ciekawy, dlaczego to zwraca wartość prawda?
if(0 < 5 < 3) {
alert("True");
}
Czyni to:
if(0 < 5 < 2) {
alert("True");
}
Ale to nie:
if(0 < 5 < 1) {
alert("True");
}
Czy to dziwactwo jest kiedykolwiek przydatne?
javascript
compare
operators
boolean-logic
punkrockbuddyholly
źródło
źródło
Odpowiedzi:
Kolejność operacji powoduje
(0 < 5 < 3)
interpretację w javascript,((0 < 5) < 3)
która tworzy(true < 3)
a wartość true jest liczona jako 1, co powoduje, że zwraca wartość true.To jest również powód
(0 < 5 < 1)
zwraca false,(0 < 5)
zwraca true, co jest interpretowane jako1
, w wyniku(1 < 1)
.źródło
if(0 < 5 < 1) == false
. Wszystko jest teraz jasne, dzięki :)((0 < 5) && (5 < 3))
, ponieważ są prawdopodobnie inne, ale ich nie znam.Domyślam się, ponieważ
0 < 5
jest to prawda itrue < 3
zostaje rzucona na1 < 3
to, co jest prawdziwe.źródło
prawdopodobnie dlatego, że
true
zakłada się, jak1
takźródło
Ponieważ
true < 3
, ponieważtrue == 1
źródło
Jeśli chodzi o twoje pytanie, czy to dziwactwo jest kiedykolwiek przydatne: przypuszczam, że może być jakiś przypadek, w którym byłby użyteczny (jeśli szukasz skondensowanego kodu), ale poleganie na nim (najprawdopodobniej) poważnie zmniejszy zrozumiałość twojego kodu.
To trochę jak użycie post / wstępnej inkrementacji / dekrementacji jako części większych wyrażeń. Czy potrafisz określić, jaki jest wynik tego kodu?
Uwaga: dzięki temu kodowi możesz czasem uzyskać różne wyniki w zależności od języka i kompilatora.
Dobrym pomysłem jest ułatwienie życia tobie i następnemu facetowi, który przeczyta Twój kod. Wyraźnie zapisz, co naprawdę chcesz, aby się stało, zamiast opierać się na efektach ubocznych, takich jak niejawna konwersja booleanów.
źródło
result
18 lat?Odpowiedź na drugą część pytania: „czy to dziwactwo jest kiedykolwiek przydatne?” jest być może nie, jak zauważono w poprzedniej odpowiedzi, jeśli rzeczywiście jest to dziwactwo języka (JavaScript), że prawda jest przypisana do 1, ale że programista nie widzi ogólnie 1 i prawda (i 0 i fałsz) jako ta sama rzecz.
Jeśli jednak masz model mentalny, w którym 1 jest prawdą, a 0 jest fałszem, prowadzi to do różnego rodzaju fajnych technik boolowskich, które są niezwykle przydatne, potężne i bezpośrednie. Na przykład możesz zwiększyć licznik bezpośrednio z wynikiem A> 100, co zwiększy licznik, jeśli A jest większe niż 100. Ta technika może być postrzegana jako dziwactwo lub sztuczka w Javie, ale w tablicy lub języku funkcjonalnym może być idiomatyczny.
Klasycznym przykładem w APL w języku tablicowym byłoby policzenie liczby elementów w tablicy, które są (powiedzmy) większe niż 100:
Gdzie, jeśli A jest tablicą 5 elementów 107 22 256 110 3, to:
daje 5-elementową tablicę boolowską:
1 0 1 1 0
i sumując ten wynik boolowski:
daje ostateczną odpowiedź:
3)
To pytanie jest doskonałym przykładem tego, gdzie ta technika byłaby bardzo przydatna, szczególnie jeśli problem jest uogólniony w celu ustalenia, czy n spośród m wartości logicznych jest prawdziwe.
Sprawdź, czy co najmniej dwa z trzech boolanów są prawdziwe
źródło
To łatwe.
Zacznij od lewej do prawej, aby ocenić pierwsze 0 <5. Czy to prawda? Tak. Ponieważ PRAWDA = 1, ocenia 1 <3. Ponieważ 1 jest mniejsze niż 3, więc to prawda.
Teraz z tym
Czy 0 jest mniejsze niż 5? Tak. Więc uczyń to PRAWDĄ, co oznacza również 1. Teraz mając to na uwadze, ocenia na (1 <1). Czy 1 jest mniejsze niż 1? Nie, dlatego to nieprawda. To musi być równe.
źródło
czy ocenia 0 <5, co zwróci 1 dla prawdy, gdy 1 <3, co jest prawdą?
C # chcę pozwolić ci to zrobić „Operator” <”nie może być stosowany do operandów typu„ bool ”i„ int ””
źródło
Wpadłem na to jakiś czas temu w Obj-C i bardzo mnie to zdziwiło. Otrzymałem pożądane wyniki, robiąc coś takiego:
Który oczywiście jest fałszywy, więc nie dostaniesz tego „prawdziwego” alarmu. Cieszę się, że to przeczytałem, teraz wiem dlaczego.
źródło
Oprócz Pythona CoffeeScript jest innym językiem, który obsługuje porównania łańcuchowe, dlatego
3 < x < 10
zostałby przekonwertowany na(3 < x && x < 10)
JS waniliowyźródło
źródło
Logiczny operand, gdy jest obsługiwany przez operator matematyczny, zwraca liczbę. aby to sprawdzić, robimy
Tak więc
0 < 5
zwrócona wartość logiczna (prawda) operowana operatorem matematycznym (<) zwróci liczbę. Czyli sprowadza się do 1 <3, co zwracatrue
źródło
ponieważ 0 jest mniejsze niż 5, to zwraca true, a domyślnie true jest cokolwiek, w tym i może być ocenione na 1, który wciąż jest mniejszy niż 3, co ponownie zwraca true
źródło
spróbuj sformułować swoje wyniki jako Number ()
lub spróbuj tego:
Przejrzałem to, ponieważ otrzymywałem
(3 >= 20) //returning true
i domyślam się, że javascript próbował sprawdzić3
jako wartość logiczną, ponieważ otrzymywałem tę wartość zelm.getAttribute();
funkcji, któraconsole.log();
była drukowana w postaci ciągu.źródło