[1,4,9].map(Math.sqrt)
da:
[1,2,3]
Dlaczego więc to robi:
['1','2','3'].map(parseInt)
uzyskaj to:
[1, NaN, NaN]
Testowałem w Firefoksie 3.0.1 i Chrome 0.3 i jako zrzeczenie się odpowiedzialności wiem, że nie jest to funkcja przeglądarki internetowej (bez IE).
Dowiedziałem się, że następujące efekty osiągną pożądany efekt. Jednak nadal nie wyjaśnia to błędnego zachowania parseInt
.
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
javascript
ćwiek
źródło
źródło
.map(parseFloat)
ponieważ zajmuje tylko jeden parametr..map(Number)
.Odpowiedzi:
Funkcja oddzwaniania
Array.map
ma trzy parametry:Z tej samej strony Mozilli , do której linkujesz:
Więc jeśli wywołasz funkcję,
parseInt
która faktycznie oczekuje dwóch argumentów, drugim argumentem będzie indeks elementu.W tym przypadku zakończyłeś dzwonienie
parseInt
z radix 0, 1 i 2 z kolei. Pierwszy jest taki sam, jak brak podania parametru, więc domyślnie oparty na danych wejściowych (w tym przypadku podstawa 10). Baza 1 jest niemożliwą bazą liczb, a 3 nie jest prawidłową liczbą w bazie 2:W takim przypadku potrzebujesz funkcji otoki:
lub ze składnią ES2015 +:
(W obu przypadkach najlepiej jest jawnie podać podstawkę,
parseInt
jak pokazano, ponieważ inaczej odgaduje podstawę na podstawie danych wejściowych. W niektórych starszych przeglądarkach wiodące 0 powodowało, że zgadł liczbę ósemkową, co zwykle było problematyczne. zgadnij hex, jeśli ciąg zaczyna się od0x
.)źródło
map
przekazuje drugi argument, którym jest (w wielu przypadkach)parseInt
zepsucie parametru radix.Jeśli używasz podkreślenia, możesz:
['10','1','100'].map(_.partial(parseInt, _, 10))
Lub bez podkreślenia:
['10','1','100'].map(function(x) { return parseInt(x, 10); });
źródło
Możesz rozwiązać ten problem, używając numeru jako funkcji iteracji:
Bez nowego operatora można użyć liczby do przeprowadzenia konwersji typu. Jednak różni się od parseInt: nie analizuje ciągu i zwraca NaN, jeśli liczby nie można przekonwertować. Na przykład:
źródło
Założę się, że dzieje się coś dziwnego z drugim parametrem parsInt, radix. Dlaczego łamie się przy użyciu Array.map, a nie kiedy wywołujesz go bezpośrednio, nie wiem.
źródło
Możesz użyć funkcji strzałki ES2015 / ES6 i po prostu przekazać numer do parsowania. Domyślna wartość dla radix to 10
Lub możesz jawnie określić podstawę dla lepszej czytelności kodu.
W powyższym przykładzie podstawa jawnie ustawiona na 10
źródło
kolejna (działająca) szybka poprawka:
źródło
parseInt
Z tego właśnie powodu należy unikać IMHO. Możesz go owinąć, aby był bardziej bezpieczny w następujących kontekstach:Argumenty lodash / fp caps iterują argumenty domyślnie na 1, aby uniknąć tych błędów. Osobiście znalazłem te obejścia, aby stworzyć tyle błędów, ile unikają. Czarna lista
parseInt
na korzyść bezpieczniejszego wdrożenia jest, moim zdaniem, lepszym podejściem.źródło