Odpowiedzi:
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.
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.
null
, undefined
), które nie działają z tą odpowiedzią prawie sprawia, że „niebezpieczne”.
null
lub undefined
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()
lub String(n)
. String(n)
jest prawdopodobnie lepszym wyborem, ponieważ nie zawiedzie, jeśli n
jest pusty lub niezdefiniowany.
null
lub undefined
. Jeśli n
jest null
lub z undefined
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 fanem String(n)
maskowania błędów.
String(n)
nadaje się do używania w funkcjonalnym stylu, np. z kombajnem podkreślenia _.compose(funcThatNeedsAStringParam, String)
.
... Parser JavaScript próbuje przeanalizować notację kropkową na liczbie jako literał zmiennoprzecinkowy.
2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first
Zuchwały język oczywiście:
var harshNum = 108;
"".split.call(harshNum,"").join("");
Lub w ES6 możesz po prostu użyć ciągów szablonów :
var harshNum = 108;
`${harshNum}`;
'' + 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ę:
s = `${n}`
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 .
n.toString()
, prawda?
n
to undefined
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.
5.41 + '' // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'
(5.41 + '')
aby używać metod String, takich jak .substring()
i innych
Jeśli chcesz sformatować wynik do określonej liczby miejsc po przecinku, na przykład w celu przedstawienia waluty, potrzebujesz czegoś takiego jak toFixed()
metoda.
number.toFixed( [digits] )
digits
to liczba cyfr wyświetlanych po przecinku.
Użyłem https://jsperf.com, aby utworzyć przypadek testowy dla następujących przypadków:
number + ''
`${number}`
String(number)
number.toString()
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)
, i number.toString()
wynosi około 95% wolniej niż najszybszy opcji.
.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.
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 jak Object.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:
/**
* Safely casts any value to string. Null and undefined are converted to ''.
* @param {*} value
* @return {string}
*/
function string (str) {
return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}
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:
123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()
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
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+''
lub 2+""
jest najszybszy.
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.
Metoda toFixed()
rozwiąże również cel.
var n = 8.434332;
n.toFixed(2) // 8.43
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ść.
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
let i=0;
console.time("test1")
for(;i<10000000;i=i+1){
const string = "" + 1234;
}
console.timeEnd("test1")
i=0;
console.time("test1.1")
for(;i<10000000;i=i+1){
const string = '' + 1234;
}
console.timeEnd("test1.1")
i=0;
console.time("test1.2")
for(;i<10000000;i=i+1){
const string = `` + 1234;
}
console.timeEnd("test1.2")
i=0;
console.time("test1.3")
for(;i<10000000;i=i+1){
const string = 1234 + '';
}
console.timeEnd("test1.3")
i=0;
console.time("test2")
for(;i<10000000;i=i+1){
const string = (1234).toString();
}
console.timeEnd("test2")
i=0;
console.time("test3")
for(;i<10000000;i=i+1){
const string = String(1234);
}
console.timeEnd("test3")
i=0;
console.time("test4")
for(;i<10000000;i=i+1){
const string = `${1234}`;
}
console.timeEnd("test4")
i=0;
console.time("test5")
for(;i<10000000;i=i+1){
const string = 1234..toString();
}
console.timeEnd("test5")
i=0;
console.time("test6")
for(;i<10000000;i=i+1){
const string = 1234 .toString();
}
console.timeEnd("test6")
wynik
test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms
Wydaje się, że wyniki są podobne w przypadku używania node.js. Uruchomiłem ten skrypt:
let bar;
let foo = ["45","foo"];
console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
bar = "" + foo;
}
console.timeEnd('string concat testing');
console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
bar = String(foo);
}
console.timeEnd("string obj testing");
console.time("string both");
for (let i = 0; i < 10000000; i++) {
bar = "" + foo + "";
}
console.timeEnd("string both");
i uzyskał następujące wyniki:
❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms
Podobne razy za każdym razem, gdy go uruchomiłem.
'' + 123e-50
zwraca"1.23e-48"
.