Conversión de cadenas y números de JavaScript

89

¿Cómo puedo hacer lo siguiente en JavaScript?

  1. Concatenar "1", "2", "3" en "123"

  2. Convertir "123" en 123

  3. Sumar 123 + 100 = 223

  4. Convierte 223 en "223"

user366312
fuente
42
Casi todos los libros de JavaScript que he leído tratan estos problemas. Pero eso esta bien. Responder preguntas es de lo que se trata StackOverflow. @Shadi Almosri - SO tiene una regla de "no seas malo". No veo el sentido de menospreciar a las personas que hacen preguntas aquí, ya que ese es el punto del lugar.
Nosredna
4
@Nosredna: entiendo completamente hacer preguntas, nada me encanta más que responderlas, pero creo que mostrar el hecho de que lo has intentado es mejor etiqueta que simplemente esperar una respuesta y también mejor para una experiencia personal de aprendizaje. Solo mi opinión, ¡no intento ser malo! :)
Shadi Almosri
1
@Shadi, entonces, ¿cómo debería haberse hecho la pregunta? ¿Con una declaración de haber buscado ya la respuesta?
Nosredna
1
Me pareció una especie de tarea cuando lo vi por primera vez, pero cuando lo releí pensé que no, parecía como si alguien estuviera experimentando con JavaScript y obteniendo resultados inesperados y queriendo concretarlo. Dicho esto, me pregunto si stackoverflow.com/faq podría incluir algo como un código de honor para estudiantes. Somos una especie de universidad global aquí, y no creo que sea una locura tratar de averiguar cuál podría ser un conjunto de ética para este lugar. O tal vez sea una locura. :-)
artlung
6
@Shadi, bueno, en el lado positivo, la pregunta y la respuesta están en StackOverflow y, con suerte, ayudarán a otras personas. Veo que la gente se queda atascada en estas cosas todo el tiempo, especialmente cuando proviene de lenguajes como Java. Hay una razón por la que la gente pregunta esto una y otra vez: es porque PIENSAN que saben cómo funcionan las expresiones en JavaScript, pero no es así. Hacen suposiciones basadas en la experiencia fuera de JS. Por eso es tan útil sentarse a probar algunas pruebas simples con la suma de cadenas y números, y probar más y menos unarios.
Nosredna

Respuestas:

120

Quiere familiarizarse con parseInt()y toString().

Y será útil en su kit de herramientas mirar una variable para averiguar qué tipo es typeof:

<script type="text/javascript">
    /**
     * print out the value and the type of the variable passed in
     */

    function printWithType(val) {
        document.write('<pre>');
        document.write(val);
        document.write(' ');
        document.writeln(typeof val);
        document.write('</pre>');
    }

    var a = "1", b = "2", c = "3", result;

    // Step (1) Concatenate "1", "2", "3" into "123"
    // - concatenation operator is just "+", as long
    //   as all the items are strings, this works
    result = a + b + c;
    printWithType(result); //123 string

    // - If they were not strings you could do
    result = a.toString() + b.toString() + c.toString();
    printWithType(result); // 123 string

    // Step (2) Convert "123" into 123
    result = parseInt(result,10);
    printWithType(result); // 123 number

    // Step (3) Add 123 + 100 = 223
    result = result + 100;
    printWithType(result); // 223 number

    // Step (4) Convert 223 into "223"
    result = result.toString(); //
    printWithType(result); // 223 string

    // If you concatenate a number with a 
    // blank string, you get a string    
    result = result + "";
    printWithType(result); //223 string
</script>
artlung
fuente
¿Alguna razón en particular por la que pones esto en las etiquetas de script?
Julix
@Julix Para principiantes en 2009, usar un archivo html para aprender un concepto básico. Si estuviera respondiendo esto de manera fresca hoy, podría hacerlo de manera diferente, pero tal vez no.
artlung
53

Paso (1) Concatenar "1", "2", "3" en "123"

 "1" + "2" + "3"

o

 ["1", "2", "3"].join("")

El método de unión concatena los elementos de una matriz en una cadena, colocando el delimitador especificado entre los elementos. En este caso, el "delimitador" es una cadena vacía ( "").


Paso (2) Convierta "123" en 123

 parseInt("123")

Antes de ECMAScript 5 , era necesario pasar la base para la base 10:parseInt("123", 10)


Paso (3) Suma 123 + 100 = 223

 123 + 100


Paso (4) Convierta 223 en "223"

 (223).toString() 


Ponlo todo junto

 (parseInt("1" + "2" + "3") + 100).toString()

o

 (parseInt(["1", "2", "3"].join("")) + 100).toString()
Patrick McElhaney
fuente
4
Buen ejemplo claro. Además, felicitaciones por la buena forma: siempre debe especificar la base de la parseIntfunción .
hotshot309
Incluir la raíz me confundió y me desplacé a otra respuesta donde se explicó. Editado en una explicación rápida para acertar en el punto de confusión.
ArtOfWarfare
@ArtOfWarfare Gracias, buena edición. La base era necesaria en el momento de esta respuesta. En estos días, puedo hacer un argumento para dejarlo fuera. A partir de ES5, que admiten todos los navegadores "modernos" y Node.js, parseInt (<a string con solo 0-9>) siempre usa base 10.
Patrick McElhaney
Dato curioso ... en el JavaScript original de Netscape (circa 1995), la base predeterminada para parseInt era 8 (a menos que la cadena contenga y 8 o un 9)
Justin Ohms
27
r = ("1"+"2"+"3")           // step1 | build string ==> "123"
r = +r                      // step2 | to number    ==> 123
r = r+100                   // step3 | +100         ==> 223
r = ""+r                    // step4 | to string    ==> "223"

//in one line
r = ""+(+("1"+"2"+"3")+100);
cesarl
fuente
Gracias por la cadena rápida -> conversión de números
mcont
Si marca que es un número o no, use parseInt (). Por ejemplo, parseInt ("") es NaN, pero + "" es 0!
Greene
15

Estas preguntas surgen todo el tiempo debido al sistema de escritura de JavaScript. La gente piensa que está obteniendo un número cuando obtiene la cadena de un número.

Aquí hay algunas cosas que puede ver que aprovechan la forma en que JavaScript maneja cadenas y números. Personalmente, desearía que JavaScript hubiera usado algún símbolo que no sea + para la concatenación de cadenas.

Paso (1) Concatenar "1", "2", "3" en "123"

result = "1" + "2" + "3";

Paso (2) Convierta "123" en 123

result = +"123";

Paso (3) Suma 123 + 100 = 223

result = 123 + 100;

Paso (4) Convierta 223 en "223"

result = "" + 223;

Si sabe POR QUÉ funcionan, es menos probable que se meta en problemas con las expresiones de JavaScript.

Nosredna
fuente
3
De hecho, creo que esta es una práctica extremadamente mala porque es bastante opaca en cuanto a lo que está sucediendo. Saber que ciertas operaciones afectan un elenco implícito es un truco, y es bueno saberlo, pero no es legible en absoluto. La comunicación lo es todo.
Annakata
1
Creo que es importante saber estas cosas CON PRECISIÓN para saber qué está pasando cuando lee el código. Gran parte de JavaScript es conciso porque se transmite como fuente, y un código pequeño puede significar una reducción del costo del servidor.
Nosredna
6
Sin embargo, debería lograr esto a través de herramientas de compresión, de esta forma es una optimización a un costo de mantenimiento muy real.
Annakata
6
Aún así, saber estas cosas ayudaría a prevenir la pregunta en primer lugar, que era la falta de conocimiento sobre cómo JavaScript maneja cadenas y números. Es una cuestión de curiosidad intelectual. ¿Qué sucede cuando agrego un número a una cadena? ¿Cómo funciona unary plus? Si no conoce las respuestas, realmente no conoce JavaScript, y este tipo de preguntas surgirán.
Nosredna
11

Puedes hacerlo así:

// step 1 
var one = "1" + "2" + "3"; // string value "123"

// step 2
var two = parseInt(one); // integer value 123

// step 3
var three = 123 + 100; // integer value 223

// step 4
var four = three.toString(); // string value "223"
Andrew Hare
fuente
16
La mejor práctica sería agregar el parámetro radix a la función parseInt (). entonces, parseInt (uno, 10) asegura que lo que sea que le arrojes no se convertirá mal.
artlung
3
Convenido. De lo contrario, los valores que comiencen con 0se verán como números octales (base 8) .
hotshot309
1
Aún más inesperado, los valores que comienzan con 0y luego contienen 8o 9fallarán, dando lugar a un retorno de 0. Por ejemplo,, parseInt('034') = 28y parseInt('09') = 0.
Robert Martin
9

Para convertir una cadena en un número, reste 0. Para convertir un número en una cadena, agregue "" (la cadena vacía).

5 + 1 te dará 6

(5 + "") + 1 te dará "51"

("5" - 0) + 1 le dará 6

Robert L
fuente
1
Confiar en trucos basados ​​en peculiaridades del lenguaje como este puede llevar a una oscuridad real. por ejemplo, "5" -0 de hecho resulta en el número 5, pero "5" +0 resulta en la cadena "50". (Sí, sé que han pasado muchos años y probablemente sea un poco triste que incluso estuviera leyendo esto.)
Nick Rice
6

parseInt está mal presentado como scanf:

parseInt ("12 monos", 10) es un número con valor '12'
+ "12 monos" es un número con valor 'NaN'
El número ("12 monos") es un número con valor 'NaN'

xander
fuente
1

A continuación se muestra un ejemplo muy irritante de cómo JavaScript puede causarle problemas:

Si solo intenta usar parseInt()para convertir a un número y luego agrega otro número al resultado, concatenará dos cadenas.

Sin embargo, puede resolver el problema colocando la expresión de suma entre paréntesis, como se muestra en el siguiente ejemplo.

Resultado: Su suma de edad es: 98; Su suma de edad NO es: 5048

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
function Person(first, last, age, eye) {
    this.firstName = first;
    this.lastName = last;
    this.age = age;
    this.eyeColor = eye;
}

var myFather = new Person("John", "Doe", "50", "blue");
var myMother = new Person("Sally", "Rally", 48, "green");

document.getElementById("demo").innerHTML = "Their age sum is: "+
 (parseInt(myFather.age)+myMother.age)+"; Their age sum is NOT: " +
 parseInt(myFather.age)+myMother.age; 
</script>

</body>
</html>

jpsousa
fuente
0

Lo más simple es cuando quieres convertir un entero en una cadena

var a,b, c;
a = 1;
b = a.toString(); // This will give you string

Ahora, de la variable b que es de tipo cadena podemos obtener el entero

c = b *1; //This will give you integer value of number :-)

Si desea marcar arriba hay un número. Si no está seguro de si b contiene un número entero, puede usar

if(isNaN(c*1)) {
  //NOt a number
}
else //number
Kshitiz
fuente
0

Podemos hacer esto usando un operador unario más para convertirlos a números primero y simplemente sumarlos. vea abajo:-

var a = "4";
var b = "7";
var sum = +a + +b; 
singhkumarhemant
fuente