Czy mogę przekonwertować ciąg reprezentujący wartość logiczną (np. „Prawda”, „fałsz”) na typ wewnętrzny w JavaScript?
Mam ukryty formularz w HTML, który jest aktualizowany na podstawie wyboru użytkownika na liście. Ta forma zawiera niektóre pola, które reprezentują wartości logiczne i są dynamicznie wypełniane wewnętrzną wartością logiczną. Jednak po umieszczeniu tej wartości w ukrytym polu wejściowym staje się ciągiem.
Jedynym sposobem, w jaki mogłem znaleźć wartość logiczną pola, po przekształceniu w ciąg, było poleganie na dosłownej wartości jego reprezentacji.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Czy istnieje lepszy sposób na osiągnięcie tego?
javascript
Kevin
źródło
źródło
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
function parseBool(val) { return val === true || val === "true" }
function checkBool(x) { if(x) {return true;} else {return false;} }
if (checkBool(x) != false) { ... } else { ... }
!!(parseInt(value) || value === "true")
Odpowiedzi:
Zrobić:
Można to zaostrzyć za pomocą operatora tożsamości (
===
), który nie dokonuje żadnych domyślnych konwersji typu, gdy porównywane zmienne mają różne typy, zamiast operatora równości (==
).Nie:
Prawdopodobnie powinieneś zachować ostrożność przy stosowaniu tych dwóch metod do swoich konkretnych potrzeb:
Każdy ciąg, który nie jest pustym ciągiem, oceni je
true
przy użyciu. Chociaż są to najczystsze metody, jakie mogę wymyślić w odniesieniu do konwersji boolowskiej, myślę, że nie są tym, czego szukasz.źródło
myValue === 'true';
jest dokładnie równoważny zmyValue == 'true';
. Nie ma żadnych korzyści w użyciu===
ponad==
tutaj.===
i!==
zawsze, gdy ma to sens, co prawie zawsze.==
kontra===
jest jednym z niewielu, w którym nie. I całkowicie zgadzam się, że to „prawie zawsze” sens stosowania===
. Istnieją luźno napisane języki , ponieważ nie chcemy przejmować się typem; jeśli sprawdzimy coś takiegoif (price >= 50)
, nie obchodzi nas, czy zaczyna się od łańcucha. Mówię, że przez większość czasu chcemy żonglować typami. W rzadkich przypadkach, gdy nie chcemy żonglowania typami (np.if (price === null)
), Używamy===
. Tak robiłem od lat i nigdy nie miałem problemu.Ostrzeżenie
Ta wysoce pozytywna, starsza odpowiedź jest technicznie poprawna, ale obejmuje tylko bardzo konkretny scenariusz, gdy wartość ciągu to DOKŁADNIE
"true"
lub"false"
.Niepoprawny ciąg json przekazany do tych funkcji poniżej ZWRÓCI wyjątek .
Oryginalna odpowiedź:
Co powiesz na?
lub z jQuery
źródło
JSON.parse("TRUE".toLowerCase())
, że można poprawnie parsować.'true'.length === 4
?typeof str==="string"
&&str.length===4
&&str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"
&&true===true && true!==false && false===false
// dla pewnościźródło
"true"
,"yes"
a"1"
. 2)toLowerCase
nie zwracanull
. 3)Boolean(string)
jest taki sam jakstring!==""
tutaj. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
false
.default: return true;
jest z pewnością możliwe. Ale zmieniłoby to zachowanie funkcji.Myślę, że to jest bardzo uniwersalne:
if (String(a) == "true")
...To idzie:
źródło
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
konstruktora:true+'' === 'true' // true
Pamiętaj, aby dopasować wielkość liter:
Ponadto, jeśli jest to pole wyboru elementu formularza, możesz również wykryć, czy to pole wyboru jest zaznaczone:
Zakładając, że jeśli jest zaznaczone, to jest „ustawione” równe true. To ocenia się jako prawda / fałsz.
źródło
myValue
tak się stanienull
,true
lub jakiś inny typ ...Możesz użyć wyrażeń regularnych:
Jeśli chcesz rozszerzyć klasę String, możesz:
Dla tych (patrz komentarze), którzy chcieliby rozszerzyć obiekt String, aby uzyskać to, ale martwią się o możliwość wyliczenia i martwią się kolizją z innym kodem, który rozszerza obiekt String:
(Oczywiście nie działa w starszych przeglądarkach, a Firefox pokazuje false, podczas gdy Opera, Chrome, Safari i IE pokazują true. Bug 720760 )
źródło
Object.defineProperty
.parseBool
Drewno-oko uważaj. Po zapoznaniu się z konsekwencjami po zastosowaniu najwyższej odpowiedzi z ponad 500 głosami pozytywnymi czuję się zobowiązany do opublikowania czegoś, co jest naprawdę przydatne:
Zacznijmy od najkrótszego, ale bardzo ścisłego sposobu:
I zakończ w odpowiedni, bardziej tolerancyjny sposób:
Testowanie:
źródło
false
wartość boolowskąJSON.parse
? Pod względem wydajności procesora i pamięciPomyślałem, że odpowiedź @Steven była najlepsza i zająłem się znacznie większą liczbą przypadków, niż gdyby przychodząca wartość była tylko łańcuchem. Chciałem go trochę rozszerzyć i zaoferować:
Nie
false
musisz uwzględniać wszystkich spraw, jeśli znasz już wszystkietrue
sprawy, które musisz uwzględnić. Możesz przekazać do tej metody wszystko, co może przekazaćtrue
wartość (lub dodać inne, to całkiem proste), a wszystko inne będzie brane pod uwagęfalse
źródło
autocomplete="on"
Uniwersalne rozwiązanie z parsowaniem JSON:
AKTUALIZACJA (bez JSON):
Stworzyłem również skrzypce, aby to przetestować http://jsfiddle.net/remunda/2GRhG/
źródło
getBool(undefined)
zawiesza się Podczas korzystania z oryginalnej wersji JSON i zwraca wartość true dla 2. wersji. Oto trzecia wersja, która zwraca false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }Twoje rozwiązanie jest w porządku.
Użycie
===
byłoby po prostu głupie w tym przypadku, ponieważ polevalue
zawsze będzie oznaczałoString
.źródło
===
? Pod względem wydajności byłoby dokładnie tak samo, gdyby oba typy były łańcuchami. W każdym razie wolę używać,===
ponieważ zawsze unikam używania==
i!=
. Uzasadnienie: stackoverflow.com/questions/359494/…value
zawsze będziestring
ani==
nor, ani===
głupie. Oba są właściwym narzędziem do tego zadania. Różnią się tylko, gdy typy nie są równe. W takim przypadku===
po prostu powracafalse
podczas==
wykonywania skomplikowanego algorytmu przymusu przed porównaniem.Spowoduje to powrót
false
do każdej wartości falsy itrue
dla każdej wartości truthy wyjątkiem'false'
,'f'
,'no'
,'n'
oraz'0'
(bez uwzględniania wielkości liter).źródło
Obiekt boolowski nie ma metody „parsowania”.
Boolean('false')
zwraca true, więc to nie zadziała.!!'false'
również zwracatrue
, więc to też nie zadziała.Jeśli chcesz, aby ciąg
'true'
zwracał wartość logiczną,true
a ciąg'false'
zwracał wartość logicznąfalse
, najprostszym rozwiązaniem jest użycieeval()
.eval('true')
zwraca true ieval('false')
zwraca false. Pamiętaj jednak o wpływie na wydajność podczas korzystaniaeval()
.źródło
var isTrueSet = (myValue === 'true');
to najlepsza odpowiedź.eval('TRUE')
; udowadniając raz jeszcze, żeeval()
jest zły.JSON.parse('TRUE')
z poniższej odpowiedzi również zawodzi spektakularnie. Bardzo łatwo jest wymusić warunek błędu w JavaScript (lub w dowolnym innym języku). Aby to wyjaśnić, najpierw należy znormalizować ciąg, np.var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
w odpowiedzi, o co mi chodzi. Nie próbuję niczego zmuszać. Wielkie literyTRUE
są na tyle powszechną wartością, że zwraca je wiele widżetów interfejsu użytkownika.Zostało to zaczerpnięte z przyjętej odpowiedzi, ale tak naprawdę ma bardzo słaby punkt i jestem zszokowany, skąd wzięła się ta liczba głosów pozytywnych, problem z tym, że musisz wziąć pod uwagę wielkość ciągu znaków, ponieważ rozróżnia się wielkość liter
źródło
Używam następujących:
Ta funkcja wykonuje zwykły logiczny przymus, z wyjątkiem ciągów „false” (bez rozróżniania wielkości liter) i „0”.
źródło
Istnieje wiele odpowiedzi i trudno jest wybrać jedną. W moim przypadku wybieram priorytet wydajności, więc tworzę ten plik jsPerf, który, mam nadzieję, może tu rzucić nieco światła.
Podsumowanie wyników (im wyższy, tym lepszy):
Są one powiązane z odpowiednią odpowiedzią, w której można znaleźć więcej informacji (za i przeciw) na temat każdego z nich; szczególnie w komentarzach.
źródło
źródło
function parseBoolean
zamiast tego utwórz nowąPo prostu szukasz wyrażenia
jak w
Testuje
myValue
to na wyrażenie regularne, bez rozróżniania wielkości liter i nie modyfikuje prototypu.Przykłady:
źródło
Aby przekonwertować zarówno ciąg znaków („prawda”, „fałsz”), jak i wartość logiczną na wartość logiczną
Gdzie
flag
może byćźródło
Dostępnych jest już tak wiele odpowiedzi. Ale w niektórych sytuacjach przydatne mogą być następujące czynności.
Może to być przydatne, gdy jeden z przykładów nie zawiera wartości boolowskich.
źródło
dlaczego nie spróbujesz czegoś takiego
Zwróci błąd, gdy podany zostanie jakiś inny tekst, a nie prawda lub fałsz, bez względu na wielkość liter, a także przechwyci liczby jako
źródło
Ta funkcja może obsługiwać zarówno ciąg znaków, jak i logiczną wartość true / false.
Pokaz poniżej:
źródło
Używam tego
źródło
"true"
lubtrue
. Jeśli przyjdzie drugi, to nie zadziała. Czy możliwe jestdocument.prototype
użycie tego, gdziekolwiek chcemy?Najprostszym sposobem (zakładając, że ciąg będzie „prawda” lub „fałsz”), jest:
Zawsze używaj operatora === zamiast operatora == dla tego typu konwersji!
źródło
Jak powiedział @ Shadow2531, nie można po prostu przekonwertować go bezpośrednio. Sugerowałbym również, abyś wziął pod uwagę ciąg znaków oprócz „prawda” i „fałsz”, które są „prawda” i „falsey”, jeśli twój kod będzie ponownie używany / używany przez innych. Oto, czego używam:
źródło
Musisz oddzielić (w swoim myśleniu) wartość swoich wyborów i reprezentację tej wartości.
Wybierz punkt w logice JavaScript, w którym muszą przejść z wartowników łańcuchowych na typ rodzimy i dokonać porównania tam, najlepiej tam, gdzie robi się to tylko raz dla każdej wartości, którą należy przekonwertować. Pamiętaj, aby zająć się tym, co musi się zdarzyć, jeśli wartownik nie jest tym, który zna skrypt (tj. Czy domyślnie przyjmujesz wartość true czy false?)
Innymi słowy, tak, musisz polegać na wartości łańcucha. :-)
źródło
Uważam, że ma ono na celu spełnienie trzech celów:
Problem z używaniem JSON polega na tym, że nie działa, powodując błąd JavaScript. To rozwiązanie nie jest elastyczne (choć spełnia wymagania 1 i 3):
To rozwiązanie nie jest wystarczająco zwięzłe:
Pracuję nad rozwiązaniem tego dokładnego problemu w przypadku pliku Typecast.js . A najlepszym rozwiązaniem dla wszystkich trzech celów jest ten:
Działa w wielu przypadkach, nie zawodzi, gdy przekazywane są wartości takie jak {} i jest bardzo zwięzły. Zwraca także wartość false jako wartość domyślną, a nie niezdefiniowaną lub zgłaszającą błąd, co jest bardziej przydatne w luźno napisanym języku JavaScript. Brawo dla innych odpowiedzi, które to sugerowały!
'true'
, ale nie dla żadnego prawdziwego wkładu. Aby osiągnąć cel nr 1, jest tylko nieco bardziej zwięzły niż rozwiązanie nr 2 i znacznie mniej czytelny.return /^(true|yes|1|t|y)$/i.test(str);
Jestem trochę późno, ale mam mały fragment, aby to zrobić, to zasadniczo zachowuje wszystkie JScripts truthey / falsey / brudny -ness ale zawiera
"false"
jako acceptible wartości dla fałszu.Wolę tę metodę od tych wymienionych, ponieważ nie polega ona na analizie kodu przez inną firmę (np .: eval / JSON.parse), co jest moim zdaniem przesadą, jest wystarczająco krótkie, aby nie wymagać funkcji narzędzia i utrzymuje inne konwencje truthey / falsey.
źródło
inne rozwiązanie. jsFiddle
przypadki testowe działają w węźle
źródło
Boże, niektóre z tych odpowiedzi są po prostu dzikie. Uwielbiam JS i jego nieskończoną liczbę sposobów na skórkę bool.
Moje preferencje, których nie byłem zaskoczony, to:
źródło
Jedna wkładka
Musimy tylko uwzględnić „fałszywy” ciąg, ponieważ jakikolwiek inny ciąg (w tym „prawda”) już istnieje
true
.Test
Bardziej wyczerpująca wersja
Test
źródło