¿Cuál es la "mejor" forma de convertir un número en una cadena (en términos de ventaja de velocidad, ventaja de claridad, ventaja de memoria, etc.)?
Algunos ejemplos:
String(n)
n.toString()
""+n
n+""
fuente
¿Cuál es la "mejor" forma de convertir un número en una cadena (en términos de ventaja de velocidad, ventaja de claridad, ventaja de memoria, etc.)?
Algunos ejemplos:
String(n)
n.toString()
""+n
n+""
Me gusta esto:
var foo = 45;
var bar = '' + foo;
En realidad, aunque normalmente lo hago así por simple conveniencia, más de 1,000 de iteraciones parece que para la velocidad bruta hay una ventaja para.toString()
Vea las pruebas de rendimiento aquí (no por mí, pero las encontré cuando fui a escribir las mías): http://jsben.ch/#/ghQYR
El más rápido basado en la prueba JSPerf anterior: str = num.toString();
Cabe señalar 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 el más rápido basado en esta prueba http://jsben.ch/#/ghQYR
Actualización 2: De nuevo, según mi prueba anterior, se debe tener en cuenta que Firefox 20.0.1 ejecuta .toString()
aproximadamente 100 veces más lento que la '' + num
muestra.
'' + 123e-50
devoluciones"1.23e-48"
.null foo
no arroja un error.En mi opinión,
n.toString()
toma el premio por su claridad, y no creo que tenga ningún gasto adicional.fuente
null
,undefined
) que no funcionan con esta respuesta difícilmente lo hace "inseguro".null
o,undefined
ya que es específico de la aplicación, aunque imagino que(n || defaultNumber).toString()
es lo que la mayoría de la gente querría en tal situación, estoy totalmente en desacuerdo con que deberíamos trabajarlo en todas las preguntas. Se trataba de convertir números a cadenas, buena arquitectura y otras conversiones de tipo donde sea necesario, son lecciones separadas.Las conversiones explícitas son muy claras para alguien que es nuevo en el lenguaje. El uso de la coerción de tipo, como han sugerido otros, conduce a la ambigüedad si un desarrollador no conoce las reglas de coerción. En última instancia, el tiempo de desarrollador es más costoso que el tiempo de CPU, por lo que optimizaría para el primero a costa de este último. Dicho esto, en este caso la diferencia probablemente sea insignificante, pero si no, estoy seguro de que hay algunos compresores JavaScript decentes que optimizarán este tipo de cosas.
Entonces, por las razones anteriores, iría con:
n.toString()
oString(n)
.String(n)
es probablemente una mejor opción porque no fallará sin
es nulo o no está definido.fuente
null
, oundefined
. Sin
esnull
o seundefined
debe a un error en mi programa, prefiero que mi programa falle en este estado, para tener una mejor oportunidad de encontrar y corregir el error. Los bloqueos del programa son regalos para el programador, para ayudarla a encontrar los errores :-). La alternativa es entregar un software que no funciona como se diseñó, habiendo pasado por alto los errores. Por lo tanto, no soy fanático de usarString(n)
para enmascarar un error.String(n)
es bueno para usar en un estilo funcional, por ejemplo, con la combinación de subrayado_.compose(funcThatNeedsAStringParam, String)
.Fuente
fuente
Lengua en la mejilla, obviamente:
O en ES6 simplemente podría usar cadenas de plantilla :
fuente
'' + number
método. Dicho esto, los resultados de estos puntos de referencia varían mucho cuando se realizan varias veces, por lo que no estoy seguro de si deben tomarse demasiado en serio.Otras respuestas ya cubrieron otras opciones, pero prefiero esta:
Breve, sucinto, ya utilizado en muchos otros lugares (si está utilizando una versión moderna de framework / ES), 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 .
fuente
n.toString()
entonces, ¿no es así?n
esundefined
, arrojará un error de sintaxis al usar.toString()
String(n)
en todos los casos? La única diferencia es que está menos claro.La forma más sencilla de convertir cualquier variable en una cadena es agregar una cadena vacía a esa variable.
fuente
(5.41 + '')
para usar los métodos de cadena como.substring()
y otrosSi necesita formatear el resultado a un número específico de lugares decimales, por ejemplo, para representar la moneda, necesita algo como el
toFixed()
método.digits
es el número de dígitos que se mostrarán después del decimal.fuente
Usé https://jsperf.com para crear un caso de prueba para los siguientes casos:
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 cadena de plantilla.Ambos
String(number)
, ynumber.toString()
son alrededor de un 95% más lentos que la opción más rápida.fuente
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 a menos que tenga una línea como
lo cual es muy explicativo
fuente
Creo que depende de la situación, pero de todos modos puede usar el
.toString()
método, ya que es muy claro de entender.fuente
.toString () es la función de conversión integrada, no soy un experto en esos detalles, pero cada vez que comparamos metodologías explícitas de versos de conversión de tipo incorporado, siempre se prefieren soluciones integradas.
fuente
Si tuviera que tener todo en cuenta, sugeriré seguir
En mi humilde opinión, es la forma más rápida de convertir a cadena. Corrígeme si estoy equivocado.
fuente
La única solución válida para casi todos los posibles casos existentes y futuros (entrada es número, nulo, indefinido, símbolo, cualquier otra cosa) es
String(x)
. No utilice 3 formas de operación simple, basándose en suposiciones de tipo de valor, como "aquí convierto definitivamente el número a cadena y aquí definitivamente booleano a cadena".Explicación:
String(x)
maneja nulos, indefinidos, símbolos, [cualquier cosa] y pide.toString()
objetos.'' + x
invoca.valueOf()
x (conversión a número), arroja símbolos, puede proporcionar resultados dependientes de la implementación.x.toString()
tira nulos e indefinidos.Nota:
String(x)
aún fallará en objetos sin prototipos comoObject.create(null)
.Si no le gustan las cadenas como 'Hola, indefinido' o desea admitir objetos sin prototipos, use la siguiente función de conversión de tipos:
fuente
Con literales numéricos, el punto para acceder a una propiedad debe distinguirse del punto decimal. Esto le deja con las siguientes opciones si desea invocar a String () en el número literal 123:
fuente
Los siguientes son los métodos para convertir un entero en una cadena en JS
Los métodos se organizan en orden decreciente de rendimiento.
(Los resultados de la prueba de rendimiento son dados por @DarckBlezzer en su respuesta)
var num = 1
Método 1:
num = `$ {num}`
Método 2:
num = num + ''
Método 3:
num = cadena (num)
Método 4:
num = num.toString ()
Nota: no puede llamar directamente a tostring () desde un número
Por ejemplo: 2.toString () arrojará Error de sintaxis no capturado : token no válido o inesperado
fuente
Si tiene curiosidad sobre cuál es el más eficaz, consulte esto donde comparo todas las diferentes conversiones de Número -> Cadena.
Parece
2+''
o2+""
son los más rápidos.https://jsperf.com/int-2-string
fuente
También podemos usar el constructor de cadenas . Según este punto de referencia , es la forma más rápida de convertir un Número a Cadena en Firefox 58, aunque es más lento que
" + num
en el popular navegador Google Chrome.fuente
El método
toFixed()
también resolverá el propósito.fuente
Puede llamar a
Number
objeto y luego llamartoString()
.Number.call(null, n).toString()
Puedes usar este truco para otros objetos nativos de JavaScript.
fuente
Acabo de encontrar esto recientemente, los métodos 3 y 4 no son apropiados porque cómo se copian las cadenas y luego se juntan. Para un programa pequeño, este problema es insignificante, pero para cualquier aplicación web real, esta acción en la que tenemos que lidiar con manipulaciones de cadenas de frecuencia puede afectar el rendimiento y la legibilidad.
Aquí está el enlace de la lectura .
fuente
Voy a volver a editar esto con más datos cuando tenga tiempo para hacerlo, por ahora está bien ...
Prueba en nodejs v8.11.2: 2018/06/06
salida
fuente
Parece resultados similares cuando se usa node.js. Ejecuté este script:
y obtuve los siguientes resultados:
Veces similares cada vez que lo ejecuté.
fuente