texto - parseint to string javascript
¿Cuál es la mejor manera de convertir un número en una cadena en JavaScript? (19)
Acabo de descubrir esto recientemente, los métodos 3 y 4 no son apropiados porque cómo se copian y se juntan las cadenas. Para un programa pequeño, este problema es insignificante, pero para cualquier aplicación web real, esta acción donde tenemos que lidiar con manipulaciones de cadenas de frecuencia puede afectar el rendimiento y la legibilidad.
¿Cuál es la "mejor" manera de convertir un número en una cadena (en términos de velocidad, ventaja de claridad, memoria, etc.)?
Algunos ejemplos:
String(n)
n.toString()
""+n
n+""
Creo que depende de la situación, pero de todos modos puedes usar el método .toString()
ya que es muy claro de entender.
En mi opinión, n.toString()
lleva el premio por su claridad, y no creo que tenga ningún costo adicional.
La forma más sencilla de convertir cualquier variable en una cadena es agregar una cadena vacía a esa variable.
5.41 + '''' // Result: the string ''5.41''
Math.PI + '''' // Result: the string ''3.141592653589793''
Las conversiones explícitas son muy claras para alguien que es nuevo en el idioma. El uso del tipo de coerción, como han sugerido otros, conduce a la ambigüedad si un desarrollador no tiene conocimiento de las reglas de coerción. En última instancia, el tiempo del desarrollador es más costoso que el tiempo de CPU, por lo que me optimizo para el primero al costo del segundo. Dicho esto, en este caso la diferencia es probablemente insignificante, pero si no, estoy seguro de que hay algunos compresores de JavaScript decentes que optimizarán este tipo de cosas.
Por lo tanto, por las razones anteriores, me gustaría ir con: n.toString()
o String(n)
. String(n)
es probablemente una mejor opción porque no fallará si n
es nulo o no definido.
Método toFixed()
también resuelve el propósito.
var n = 8.434332;
n.toFixed(2) // 8.43
Me gusta esto:
var foo = 45;
var bar = '''' + foo;
En realidad, a pesar de que normalmente lo hago así para una simple conveniencia, en más de 1,000 iteraciones que aparece para velocidad bruta, hay una ventaja para .toString()
Vea las pruebas de rendimiento aquí (no por mí, pero las encontré cuando escribí las mías): http://jsben.ch/#/ghQYR
Más rápido según la prueba JSPerf anterior: str = num.toString();
Debe tenerse en cuenta que la diferencia de velocidad no es demasiado significativa si considera que puede realizar la conversión de cualquier manera 1 millón de veces en 0,1 segundos .
Actualización: La velocidad parece diferir mucho según el navegador. En Chrome num + ''''
parece ser más rápido según esta prueba http://jsben.ch/#/ghQYR
Actualización 2: Una vez más, según mi prueba anterior, se debe tener en cuenta que Firefox 20.0.1 ejecuta el .toString()
aproximadamente 100 veces más lento que la muestra '''' + num
.
Me gustan los dos primeros ya que son más fáciles de leer. Tiendo a usar String(n)
pero es solo una cuestión de estilo que cualquier otra cosa.
Eso es menos que tengas una línea como
var n = 5;
console.log ("the number is: " + n);
lo cual es muy autoexplicativo
Otras respuestas ya cubrieron otras opciones, pero prefiero esta:
number.toFixed( [digits] )
Corto, sucinto, ya utilizado en muchos otros lugares (si está usando una versión de framework / ES moderna), por lo que es una apuesta segura que cualquier programador lo entenderá.
No es que (generalmente) importe mucho, pero también parece estar entre los más rápidos en comparación con otros métodos .
Parece resultados similares cuando se usa node.js. Ejecuté este script:
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");
y obtuve los siguientes resultados:
❯ node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms
Tiempos similares cada vez que lo corrí.
Puede llamar al objeto Number
y luego llamar a toString()
.
Number.call(null, n).toString()
Puedes usar este truco para otros objetos nativos de javascript.
Si necesita dar formato al resultado a un número específico de lugares decimales, por ejemplo, para representar la moneda, necesita algo como el método toFixed()
.
s = `${n}`
digits
es el número de dígitos para mostrar después del lugar decimal.
Si tiene curiosidad por saber cuál es el más eficaz, vea esto donde comparo todas las diferentes conversiones de Número -> Cadena.
Parece que 2+''''
o 2+""
son los más rápidos.
Si tuviera que tomar todo en consideración, sugeriré lo siguiente
var myint = 1;
var mystring = myint + '''';
/*or int to string*/
myint = myint + ''''
En mi humilde opinión, es la forma más rápida de convertir a cadena. Corrígeme si estoy equivocado.
También podemos usar el constructor de String . De acuerdo con jsben.ch/ghQYR , es la forma más rápida de convertir un Número en Cadena en Firefox 58 aunque sea más lento que " + num
en el popular navegador Google Chrome.
Utilicé https://jsperf.com para crear un caso de prueba para los siguientes casos:
number + ''''
`${number}`
String(number)
number.toString()
https://jsperf.com/number-string-conversion-speed-comparison
A partir del 24 de julio de 2018, los resultados dicen que number + ''''
es el más rápido en Chrome, en Firefox que se vincula con los literales de la cadena de plantillas.
Tanto String(number)
como number.toString()
son aproximadamente un 95% más lentos que la opción más rápida.
Voy a reeditar esto con más datos cuando tenga tiempo para hacerlo, por ahora esto está bien ...
Prueba en 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")
salida
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
Lengua en la mejilla, obviamente:
var harshNum = 108;
"".split.call(harshNum,"").join("");
O en ES6 simplemente puedes usar cadenas de plantillas :
var harshNum = 108;
`${harshNum}`;
2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first