String JavaScript e conversão de número

89

Como posso fazer o seguinte em JavaScript?

  1. Concatene "1", "2", "3" em "123"

  2. Converta "123" em 123

  3. Adicione 123 + 100 = 223

  4. Converta 223 em "223"

user366312
fonte
42
Quase todos os livros sobre JavaScript que li tratam dessas questões. Mas tudo bem. Responder a perguntas é o objetivo do StackOverflow. @Shadi Almosri - SO tem uma regra "não seja mau". Não vejo sentido em menosprezar as pessoas que fazem perguntas aqui, já que esse é o objetivo do lugar.
Nosredna
4
@Nosredna: eu entendo perfeitamente fazer perguntas, nada adoro mais do que respondê-las, mas acho que mostrar o fato de que você tentou é melhor etiqueta do que simplesmente esperar uma resposta e também é melhor para uma experiência pessoal de aprendizagem. Apenas minha opinião, não tentando ser má! :)
Shadi Almosri
1
@Shadi, então como a pergunta deveria ter sido feita? Com a declaração de já ter procurado a resposta?
Nosredna
1
Pareceu-me um tipo de lição de casa quando o vi pela primeira vez, mas quando reli achei que não, parecia que alguém estava experimentando em JavaScript e obtendo resultados inesperados e querendo descobrir. Dito isso, eu me pergunto se stackoverflow.com/faq pode incluir algo como um código de honra para alunos. Somos uma espécie de universidade global aqui, e não acho que seja loucura tentar descobrir o que um conjunto de ética pode ser para este lugar. Ou talvez seja uma loucura. :-)
artlung
6
@Shadi, bem, do lado positivo, a pergunta e a resposta estão no StackOverflow e, com sorte, ajudarão outras pessoas. Eu vejo as pessoas ficarem presas nisso o tempo todo, especialmente quando vêm de linguagens como Java. Há uma razão pela qual as pessoas perguntam isso repetidamente - é porque elas ACHAM que sabem como as expressões em JavaScript funcionam, mas não sabem. Eles fazem suposições com base na experiência fora da JS. É por isso que é tão útil experimentar alguns testes simples, adicionando strings e números, e tentando mais e menos unários.
Nosredna

Respostas:

120

Você deseja se familiarizar com parseInt()e toString().

E útil em seu kit de ferramentas será olhar para uma variável para descobrir de que tipo ela é— 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
fonte
Algum motivo específico para colocar isso nas tags de script?
Julix
@Julix Para iniciantes em 2009, acessando um arquivo html para aprender um conceito básico. Se eu estivesse respondendo a isso hoje, poderia fazer de forma diferente, mas talvez não.
artlung
53

Etapa (1) Concatenar "1", "2", "3" em "123"

 "1" + "2" + "3"

ou

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

O método join concatena os itens de uma matriz em uma string, colocando o delimitador especificado entre os itens. Nesse caso, o "delimitador" é uma string vazia ( "").


Etapa (2) Converter "123" em 123

 parseInt("123")

Antes do ECMAScript 5 , era necessário passar o radical para a base 10:parseInt("123", 10)


Etapa (3) Adicionar 123 + 100 = 223

 123 + 100


Etapa (4) Converter 223 em "223"

 (223).toString() 


Coloque tudo junto

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

ou

 (parseInt(["1", "2", "3"].join("")) + 100).toString()
Patrick McElhaney
fonte
4
Bom exemplo claro. Além disso, parabéns pela boa forma - você deve sempre especificar a raiz da parseIntfunção .
hotshot309
Incluir o radical me confundiu e eu rolei para outra resposta onde era explicado. Editado em uma explicação rápida para estar certo no ponto de confusão.
ArtOfWarfare
@ArtOfWarfare Obrigado, boa edição. O radical era necessário no momento desta resposta. Hoje em dia, um argumento pode ser feito para deixá-lo de fora. A partir do ES5, que todos os navegadores “modernos” e Node.js suportam, parseInt (<a string com apenas 0-9>) sempre usa a base 10.
Patrick McElhaney
fato curioso .. no JavaScript original da Netscape (por volta de 1995) a raiz padrão para parseInt era 8 (a menos que a string contivesse e 8 ou 9)
Justin Ohms
26
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
fonte
Obrigado pela string rápida -> conversão de número
mcont
Se você verificar se é um número ou não, use parseInt (). Por exemplo, parseInt ("") é NaN, mas + "" é 0!
Greene
15

Essas questões surgem o tempo todo devido ao sistema de digitação do JavaScript. As pessoas pensam que estão obtendo um número quando estão obtendo a sequência de um número.

Aqui estão algumas coisas que você pode ver que tiram vantagem da maneira como o JavaScript lida com strings e números. Pessoalmente, gostaria que o JavaScript tivesse usado algum símbolo diferente de + para concatenação de strings.

Etapa (1) Concatenar "1", "2", "3" em "123"

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

Etapa (2) Converter "123" em 123

result = +"123";

Etapa (3) Adicionar 123 + 100 = 223

result = 123 + 100;

Etapa (4) Converter 223 em "223"

result = "" + 223;

Se você sabe POR QUE eles funcionam, é menos provável que tenha problemas com expressões JavaScript.

Nosredna
fonte
3
Na verdade, acho que essa é uma prática extremamente ruim porque é bastante opaca quanto ao que está acontecendo. Saber que certas operações afetam um elenco implícito é um truque, e é bom saber, mas não é de todo legível. A comunicação é tudo.
annakata
1
Eu acho que é importante saber essas coisas com PRECISÃO para que você saiba o que está acontecendo ao ler o código. Muito do JavaScript é conciso porque é transmitido como fonte, e um código pequeno pode significar redução de custo do servidor.
Nosredna
6
Você deve conseguir isso por meio de ferramentas de compressão, porém, nesta forma, é a otimização com um custo de manutenção muito real.
annakata
6
Ainda assim, saber dessas coisas ajudaria a evitar a questão em primeiro lugar, que era a falta de conhecimento sobre como o JavaScript lida com strings e números. É uma questão de curiosidade intelectual. O que acontece quando adiciono um número a uma string? Como funciona o plus unário? Se você não sabe as respostas, não conhece realmente JavaScript, e esse tipo de pergunta vai surgir.
Nosredna
11

Você pode fazer assim:

// 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
fonte
16
A melhor prática seria adicionar o parâmetro raiz à função parseInt (). portanto, parseInt (um, 10) garante que tudo o que você jogar nele não será mal convertido.
artlung
3
Acordado. Caso contrário, os valores que começam com 0serão vistos como números octais (base 8) .
hotshot309
1
Ainda mais inesperado, valores que começam com 0e depois contêm 8ou 9falharão, levando a um retorno de 0. Por exemplo,, parseInt('034') = 28e parseInt('09') = 0.
Robert Martin
9

Para converter uma string em um número, subtraia 0. Para converter um número em uma string, adicione "" (a string vazia).

5 + 1 lhe dará 6

(5 + "") + 1 dará a você "51"

("5" - 0) + 1 dará a você 6

Robert L
fonte
1
Depender de truques baseados em peculiaridades da linguagem como essa pode levar à verdadeira obscuridade. por exemplo, "5" -0 realmente resulta no número 5, mas "5" +0 resulta na string "50". (Sim, eu sei que muitos anos depois e provavelmente é um pouco triste eu estar lendo isso.)
Nick Rice
6

parseInt é mal caracterizado como scanf:

parseInt ("12 macacos", 10) é um número com valor '12'
+ "12 macacos" é um número com valor 'NaN'
O número ("12 macacos") é um número com valor 'NaN'

xander
fonte
1

Abaixo está um exemplo muito irritante de como o JavaScript pode causar problemas:

Se você apenas tentar usar parseInt()para converter em número e adicionar outro número ao resultado, ele concatenará duas strings.

No entanto, você pode resolver o problema colocando a expressão de soma entre parênteses, conforme mostrado no exemplo abaixo.

Resultado: a soma das idades é: 98; A soma da idade NÃO é: 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
fonte
0

O mais simples é quando você quer fazer um inteiro uma string fazer

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

Agora, a partir da variável b, que é do tipo string, podemos obter o inteiro

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

Se você quiser verificar acima é um número. Se você não tiver certeza se b contém um inteiro, você pode usar

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

Podemos fazer isso usando o operador mais unário para convertê-los em números primeiro e simplesmente adicionar. ver abaixo:-

var a = "4";
var b = "7";
var sum = +a + +b; 
Singhkumarhemant
fonte