W JS możesz zwrócić wartość logiczną o niestandardowych właściwościach. Na przykład. gdy Modernizr testuje obsługę wideo, zwraca true
lub false
ale zwrócony Boolean (Bool jest obiektem pierwszej klasy w JS) ma właściwości określające obsługiwane formaty. Z początku trochę mnie to zaskoczyło, ale potem spodobał mi się ten pomysł i zacząłem się zastanawiać, dlaczego wydaje się być stosowany raczej oszczędnie?
Wygląda to na elegancki sposób radzenia sobie ze wszystkimi scenariuszami, w których zasadniczo chcesz wiedzieć, czy coś jest prawdą czy fałszem, ale możesz być zainteresowany dodatkowymi informacjami, które możesz zdefiniować bez definiowania niestandardowego obiektu zwrotnego lub korzystania z funkcji wywołania zwrotnego przygotowanej do zaakceptuj więcej parametrów. W ten sposób zachowujesz bardzo uniwersalną sygnaturę funkcji bez uszczerbku dla możliwości zwracania bardziej złożonych danych.
Są 3 argumenty przeciwko temu, które mogę sobie wyobrazić:
- Jest to nieco rzadkie / nieoczekiwane, gdy prawdopodobnie lepiej jest, aby jakikolwiek interfejs był przejrzysty i nietrudny.
- Może to być argument o słomce, ale ponieważ jest to trochę skrajny przypadek, mogę sobie wyobrazić, że cicho odpiera niektóre optymalizatory JS, uglifier, VM lub po drobnej zmianie specyfikacji języka czyszczenia itp.
- Jest lepszy - zwięzły, jasny i powszechny - sposób robienia dokładnie tego samego.
Więc moje pytanie: czy są jakieś ważne powody, aby unikać używania booleanów z dodatkowymi właściwościami? Czy to podstęp, czy uczta?
Ostrzeżenie o zwrotach akcji.
Powyżej jest oryginalne pytanie w pełnej krasie. Jak zauważyli Matthew Crumley i senevoldsen, opiera się ono na fałszywej (falsy?) Przesłance. Zgodnie z tradycją JS Modernizr to sztuczka językowa i brudna. Sprowadza się to do tego, że JS ma prymitywną wartość bool, która jeśli ustawiona na false, pozostanie fałszywa nawet po próbie dodania rekwizytów (która kończy się niepowodzeniem) i obiekt logiczny, który może mieć niestandardowe rekwizyty, ale bycie obiektem jest zawsze zgodne z prawdą. Modernizr zwraca wartość logiczną false lub true Boolean.
Moje oryginalne pytanie zakładało, że sztuczka działa inaczej, więc najpopularniejsze odpowiedzi dotyczą (doskonale poprawnych) aspektów standardów kodowania. Jednak uważam, że odpowiedzi obalające całą sztuczkę są najbardziej pomocne (a także ostateczne argumenty przeciwko użyciu tej metody), więc akceptuję jedną z nich. Dziękujemy wszystkim uczestnikom!
null
jeśli nie są obsługiwane, i tablicę formatów, jeśli tak. Lista jest uważana za prawdziwą w JS inull
jest fałszem.Odpowiedzi:
Oprócz ogólnych zasad projektowania, takich jak pojedyncza odpowiedzialność i najmniej zaskakujące, istnieje specyficzny dla JavaScript przyczyna, dla której nie jest to dobry pomysł: istnieje ogromna różnica między a
boolean
iBoolean
JavaScript, która uniemożliwia działanie w ogólnym przypadku.boolean
jest typem pierwotnym, a nie obiektem i nie może mieć właściwości niestandardowych. Wyrażenia lubiątrue.toString()
pracę, ponieważ za kulisami, okazuje się(new Boolean(true)).toString()
.Boolean
(z dużą literą B) jest przedmiotem, ale ma bardzo niewiele dobrych zastosowań, a używanie go jakoboolean
zdecydowanie nie jest jednym z nich. Powodem tego jest to, że każdyBoolean
jest „prawdziwy”, niezależnie od jego wartości , ponieważ wszystkie obiekty są konwertowane natrue
kontekst boolowski. Na przykład spróbuj tego:Ogólnie rzecz biorąc, nie ma możliwości dodania właściwości do wartości logicznej w JavaScript, która nadal pozwala zachować się w logiczny sposób. Modernizr może sobie z tym poradzić, ponieważ tylko dodaje właściwości do „prawdziwych” wartości, które działają tak, jak byś się spodziewał (tj. Działają w instrukcjach if). Jeśli wideo nie jest w ogóle obsługiwane,
Modernizr.video
będzie rzeczywisteboolean
(z wartościąfalse
) i nie będzie można do niego dodawać właściwości.źródło
true
warunkowe. Po co jawnie używaćBoolean
?false
to zarówno „fałszywe”, jak i fałszywe (===
i==
działa jako) ALE tak naprawdę nie można dodawać rekwizytów do prymitywnego bool. Rozróżnienie między Boolem a boolem najwyraźniej mnie ucierpiało.TypeError
jeśli spróbujesz dodać właściwość (zobacz jsbin.com/yovasafibo/edit?js,console ).Gratulacje, odkryłeś przedmioty. Powód, aby tego nie robić, nazywa się zasadą najmniejszego zdziwienia . Zaskoczenie projektem nie jest dobrą rzeczą.
Nie ma nic złego w łączeniu tych informacji, ale dlaczego chcesz ukryć je w Bool? Umieść to w czymś, czego można oczekiwać od wszystkich tych informacji. Bool w zestawie.
źródło
Głównym argumentem przeciwko trzymam to znaczy, że zasada jednej odpowiedzialności , logiczną powinien mówić tylko wtedy, gdy coś jest
true
albofalse
nie, dlaczego i w jaki sposób lub innych rzeczy. Jestem głęboko przekonany i praktykuję, że do przekazywania tej lub innych informacji należy używać innych przedmiotów.źródło
Boolean
Niezależnie od shenaniganów JavaScript .Ponieważ jedynym powodem, dla którego nazywa się to wartością logiczną, jest fakt, że jest to prawda lub fałsz, nie podoba mi się ten pomysł, ponieważ podważasz cały jego cel z wikipedii
(moje pogrubienie)
źródło
Tylko dlatego, że nie oznacza to, że powinieneś, w JS możesz praktycznie dołączyć właściwości do dowolnego obiektu (w tym booleany)
Jak to źle?
Z jednej strony możesz dołączyć do Boolean więcej nieistotnych danych (na przykład), czego nie spodziewa się inny programista, ponieważ dlaczego miałby tam być ?! boole są tylko dla prawdy i fałszu.
Kontrapunktem jest dołączenie pewnych przydatnych przydatnych właściwości, które mogą pomóc ci poradzić sobie z wartością logiczną ( Java to robi ).
Na przykład możesz dołączyć funkcję, która konwertuje wartość logiczną na ciąg,
dirty
flagę, która okazała się prawdą, jeśli wartość została zmieniona, obserwatory i wywołania zwrotne zdarzeń, które mogą zostać uruchomione, gdy wartość zostanie zmieniona itp.To brzmi jak coś, co nie powinno być przechowywane w logicznej wartości logicznej, ale raczej przy użyciu zestawu wartości logicznych lub zestawu właściwości z wartościami logicznymi wewnątrz nich. Myślę, że lepszym rozwiązaniem byłoby zwrócenie obiektu ze wszystkimi formatami i szczegółami wsparcia.
źródło
Nie można tworzyć boolanów z własnymi właściwościami w JavaScript. Następujące błędy (przynajmniej w FF):
Możesz użyć lub odziedziczyć po Boolean, ale jak mówi Matthew Crumley, daje to inne wyniki.
Boolean
jest typuObject
. Gdy JS potrzebuje wartości logicznej wyrażenia, konwertuje za pomocą funkcji specyfikacjiToBoolean
, która nakazuje, aby dlaObject
s zawsze wynik był zawszetrue
. Tak więc wartośćnew Boolean(false)
ocenia się natrue
! Możesz to sprawdzić w tym przykładzie: https://jsfiddle.net/md7abx5z/3/ .Jedyny powód, dla którego działa on dla Modernizr, jest przypadkowy. Tworzą obiekt tylko
Boolean
wtedy, gdy warunek jest spełniony. Kiedy oceniają fałsz, po prostu powracająfalse
. To działa, ponieważ zwracająBoolean
obiekty tylko wtedy, gdy wynik był i tak prawdziwy, a nigdy, gdy jest to fałsz.źródło
Rozumiem, że kontekst się zmienił, ale chciałbym odpowiedzieć na oryginalne pytanie, które przeczytałem jako przykład JS, ale nie tylko JS.
Dodanie właściwości do wartości logicznej nie stanowiłoby problemu, JEŻELI właściwości miałyby coś wspólnego z wartością prawda / fałsz, a nie ze zmienną przechowującą wartość. Na przykład dodanie metody toYesNoString byłoby w porządku, dodanie wartości numberOfChildren do wartości hasChildren nie jest, i żadne z nich nie zadałoby pytań Missed studentPassed. Nie ma wiele rzeczy, które można dodać do wartości logicznej, oprócz różnych powtórzeń ciągów, jedyną właściwością, o której myślę, że ma sens, jest originalExpression. Ale dodanie do tego niekoniecznie jest złym pomysłem w teorii.
źródło
Jeśli spojrzę na kod, tak naprawdę nie chodzi tu o podanie niestandardowych właściwości Boolean, ale o metodę, która ma metody zwracania z różnymi podpisami.
Jeśli jest to fałsz, to otrzymujesz prymitywny fałsz, a jeśli to prawda, zwraca obiekt, który z definicji jest interpretowany jako prawda w javascript.
Moim zdaniem Twoim pytaniem nie powinno być to, czy warto nadać logiczne właściwości niestandardowe, ale czy warto mieć metody z wieloma podpisami zwrotnymi.
źródło
Czy w podanym przykładzie nie można po prostu zwrócić tablicy wszystkich obsługiwanych formatów wideo?
Powiedziałbym przynajmniej, że użycie tablicy jest nieco mniej zaskakujące niż posiadanie „niestandardowych booleanów”.
W Javascripcie pusta tablica jest nawet uważana za fałsz , podczas gdy niepusta tablica jest prawdziwa , więc przy odrobinie szczęścia możesz po prostu przełączyć się na tablice i wszystko działałoby tak jak przededycją Nie, głupio, że myślałem, że pamiętam prawdę obiektów w JavaScript: Pźródło
""
ma typof,"string"
ale tak naprawdę jest fałszem[].length
jest falsey, jeśli długość jest0
, nie jest dużo więcej pisania, i moim zdaniem jest lepszym wskazaniem intencji niżif([])
byłoby nawet, gdyby to zadziałało.