Jaki jest „najlepszy” sposób przekonwertowania liczby na ciąg znaków (pod względem przewagi prędkości, przewagi przejrzystości, przewagi pamięci itp.)?
Kilka przykładów:
String(n)
n.toString()
""+n
n+""
źródło
Jaki jest „najlepszy” sposób przekonwertowania liczby na ciąg znaków (pod względem przewagi prędkości, przewagi przejrzystości, przewagi pamięci itp.)?
Kilka przykładów:
String(n)
n.toString()
""+n
n+""
lubię to:
var foo = 45;
var bar = '' + foo;
W rzeczywistości, chociaż zazwyczaj robię to w ten sposób dla wygody, w przypadku ponad 1000 iteracji wydaje się, że dla prędkości pierwotnej istnieje zaleta dla.toString()
Zobacz testy wydajności tutaj (nie przeze mnie, ale znalazłem, kiedy poszedłem pisać własne): http://jsben.ch/#/ghQYR
Najszybszy na podstawie powyższego testu JSPerf: str = num.toString();
Należy zauważyć, że różnica prędkości nie jest zbyt znacząca, jeśli weźmie się pod uwagę, że można wykonać konwersję w jakikolwiek sposób 1 milion razy w 0,1 sekundy .
Aktualizacja: Szybkość wydaje się znacznie różnić w zależności od przeglądarki. W Chrome num + ''
wydaje się być najszybszy na podstawie tego testu http://jsben.ch/#/ghQYR
Aktualizacja 2: Znowu na podstawie mojego powyższego testu należy zauważyć, że Firefox 20.0.1 wykonuje .toString()
około 100 razy wolniej niż '' + num
próbka.
'' + 123e-50
zwraca"1.23e-48"
.null foo
nie rzuca błędu.Moim zdaniem
n.toString()
bierze nagrodę za wyrazistość i nie sądzę, że wiąże się to z dodatkowymi kosztami.źródło
null
,undefined
), które nie działają z tą odpowiedzią prawie sprawia, że „niebezpieczne”.null
lubundefined
ponieważ jest ona specyficzna dla aplikacji, podczas gdy wyobrażam sobie, że(n || defaultNumber).toString()
jest to, czego większość ludzi chciałaby w takiej sytuacji, zdecydowanie nie zgadzam się, że powinniśmy pracować nad wszystkimi pytaniami. Chodziło o konwersję liczb na ciągi znaków, dobrą architekturę i konwersje innego typu, gdzie potrzebne były osobne lekcje.Jawne konwersje są bardzo jasne dla kogoś, kto nie zna języka. Używanie przymusu typu, jak sugerują inni, prowadzi do niejednoznaczności, jeśli programista nie jest świadomy reguł przymusu. Ostatecznie czas programisty jest droższy niż czas procesora, więc zoptymalizuję ten pierwszy kosztem drugiego. Biorąc to pod uwagę, w tym przypadku różnica jest prawdopodobnie znikoma, ale jeśli nie, jestem pewien, że istnieją pewne przyzwoite kompresory JavaScript, które zoptymalizują tego rodzaju rzeczy.
Z powyższych powodów wybrałbym:
n.toString()
lubString(n)
.String(n)
jest prawdopodobnie lepszym wyborem, ponieważ nie zawiedzie, jeślin
jest pusty lub niezdefiniowany.źródło
null
lubundefined
. Jeślin
jestnull
lub zundefined
powodu błędu w moim programie, wolałbym, aby mój program zawiódł w tym stanie, aby dać mi większą szansę na znalezienie i naprawienie błędu. Awarie programowe są prezentem dla programisty, który pomaga jej znaleźć błędy :-). Alternatywą jest dostarczenie oprogramowania, które nie działa zgodnie z przeznaczeniem, po dokładnym przejrzeniu błędów. Nie jestem fanemString(n)
maskowania błędów.String(n)
nadaje się do używania w funkcjonalnym stylu, np. z kombajnem podkreślenia_.compose(funcThatNeedsAStringParam, String)
.Źródło
źródło
Zuchwały język oczywiście:
Lub w ES6 możesz po prostu użyć ciągów szablonów :
źródło
'' + number
metoda. To powiedziawszy, wyniki tych testów porównawczych bardzo się różnią podczas ich wielokrotnego wykonywania, więc nie jestem pewien, czy należy je traktować zbyt poważnie.Inne odpowiedzi już dotyczyły innych opcji, ale wolę tę:
Krótkie, zwięzłe, używane już w wielu innych miejscach (jeśli używasz nowoczesnej wersji framework / ES), więc jest to bezpieczny zakład, że każdy programista to zrozumie.
Nie znaczy to, że (zwykle) ma to duże znaczenie, ale wydaje się również, że należy do najszybszych w porównaniu do innych metod .
źródło
n.toString()
, prawda?n
toundefined
będzie rzucać błąd składni przy użyciu.toString()
String(n)
we wszystkich przypadkach? Jedyną różnicą jest to, że jest mniej jasne.Najprostszym sposobem na konwersję dowolnej zmiennej na ciąg jest dodanie pustego ciągu do tej zmiennej.
źródło
(5.41 + '')
aby używać metod String, takich jak.substring()
i innychJeśli chcesz sformatować wynik do określonej liczby miejsc po przecinku, na przykład w celu przedstawienia waluty, potrzebujesz czegoś takiego jak
toFixed()
metoda.digits
to liczba cyfr wyświetlanych po przecinku.źródło
Użyłem https://jsperf.com, aby utworzyć przypadek testowy dla następujących przypadków:
https://jsperf.com/number-string-conversion-speed-comparison
Według stanu na 24 lipca 2018 r. Wyniki wskazują, że
number + ''
jest to najszybszy w Chrome, w Firefox, który łączy się z literałami ciągów szablonów.Obaj
String(number)
, inumber.toString()
wynosi około 95% wolniej niż najszybszy opcji.źródło
Lubię dwa pierwsze, ponieważ są łatwiejsze do odczytania. Zwykle używam,
String(n)
ale to tylko kwestia stylu niż cokolwiek innego.To znaczy, chyba że masz linię jak
co jest bardzo oczywiste
źródło
Myślę, że to zależy od sytuacji, ale i tak możesz użyć tej
.toString()
metody, ponieważ jest to bardzo jasne do zrozumienia.źródło
.toString () to wbudowana funkcja rzutowania czcionek, nie jestem ekspertem w tych szczegółach, ale ilekroć porównujemy wbudowane metody rzutowania wierszy, zawsze preferowane są wbudowane obejścia.
źródło
Gdybym musiał wziąć wszystko pod uwagę, zasugeruję następujące
IMHO, to najszybszy sposób na konwersję na ciąg. Popraw mnie, jeśli się mylę.
źródło
Jedynym prawidłowym rozwiązaniem dla prawie wszystkich możliwych istniejących i przyszłych przypadków (wejście to liczba, null, niezdefiniowany, symbol, cokolwiek innego) to
String(x)
. Nie używaj 3 sposobów prostej operacji, w oparciu o założenia typu wartości, np. „Tutaj zdecydowanie przekonwertowałem liczbę na ciąg znaków, a tutaj zdecydowanie boolean na ciąg znaków”.Wyjaśnienie:
String(x)
obsługuje wartości zerowe, niezdefiniowane, symbole, [cokolwiek] i wywołuje.toString()
obiekty.'' + x
wywołuje.valueOf()
x (rzut na numer), rzuca symbole, może zapewnić wyniki zależne od implementacji.x.toString()
rzuca na wartości zerowe i niezdefiniowane.Uwaga:
String(x)
nadal zawiedzie na obiektach bez prototypów, takich jakObject.create(null)
.Jeśli nie lubisz ciągów takich jak „Hello, undefined” lub chcesz obsługiwać obiekty bez prototypów, użyj następującej funkcji konwersji typu:
źródło
W przypadku literałów liczbowych kropka dostępu do właściwości musi być odróżniona od kropki dziesiętnej. To pozostawia Ci następujące opcje, jeśli chcesz wywołać String () na literał liczbowy 123:
źródło
Poniżej znajdują się metody konwersji liczby całkowitej na ciąg w JS
Metody są ułożone w kolejności malejącej wydajności.
(Wyniki testu wydajności podane przez @DarckBlezzer w swojej odpowiedzi)
var num = 1
Metoda 1:
num = `$ {num}`
Metoda 2:
num = num + ''
Metoda 3:
num = ciąg (num)
Metoda 4:
num = num.toString ()
Uwaga: Nie można bezpośrednio wywoływać funkcji tostring () z numeru
Np .: 2.toString () wyrzuci Uncaught SyntaxError : Niepoprawny lub nieoczekiwany token
źródło
Jeśli jesteś ciekawy, która z nich jest najbardziej wydajna, sprawdź to, gdzie porównuję wszystkie różne konwersje Number -> String.
Wygląda
2+''
lub2+""
jest najszybszy.https://jsperf.com/int-2-string
źródło
Możemy również użyć konstruktora String . Według tego testu porównawczego jest to najszybszy sposób konwersji liczby na ciąg znaków w przeglądarce Firefox 58, nawet jeśli jest wolniejszy niż
" + num
w popularnej przeglądarce Google Chrome.źródło
Metoda
toFixed()
rozwiąże również cel.źródło
Możesz wywołać
Number
obiekt, a następnie zadzwonićtoString()
.Number.call(null, n).toString()
Możesz użyć tej sztuczki do innych rodzimych obiektów javascript.
źródło
Po prostu natknęliśmy się na to niedawno, metody 3 i 4 nie są odpowiednie, ponieważ w jaki sposób ciągi są kopiowane, a następnie łączone. W przypadku małego programu problem ten jest nieznaczny, ale w przypadku każdej prawdziwej aplikacji internetowej działanie, w którym mamy do czynienia z manipulacjami ciągami częstotliwości, może wpłynąć na wydajność i czytelność.
Oto link do przeczytania .
źródło
Mam zamiar ponownie to edytować, dodając więcej danych, kiedy będę miał na to czas, bo w tej chwili jest w porządku ...
Test w nodejs v8.11.2: 2018/06/06
wynik
źródło
Wydaje się, że wyniki są podobne w przypadku używania node.js. Uruchomiłem ten skrypt:
i uzyskał następujące wyniki:
Podobne razy za każdym razem, gdy go uruchomiłem.
źródło