validacion - validar formulario javascript antes de enviar
¿Por qué JavaScript maneja los operadores más y menos entre cadenas y números de manera diferente? (6)
No entiendo por qué JavaScript funciona de esta manera.
console.log("1" + 1);
console.log("1" - 1);
La primera línea imprime 11, y la segunda imprime 0. ¿Por qué JavaScript maneja la primera como una cadena y la segunda como un número?
De acuerdo con el estándar EcmaScript 262. Los operadores +
y -
comportan de manera diferente cuando se trata de cadenas. El primero convierte cada valor en una cadena. El segundo convierte cada valor en un número.
Del estándar:
Si Type (lprim) es String o Type (rprim) es String, entonces Return the String que es el resultado de concatenar ToString (lprim) seguido de ToString (rprim)
Estas reglas implican que si en la expresión hay un valor de cadena, todos los valores involucrados en la operación +
se convierten en una cadena. En JavaScript, cuando el operador +
se usa con cadenas, las concatena. Es por eso que console.log("5"+1)
devuelve "51". 1
se convierte en una cadena y luego, "5" + "1" se concatenan juntos.
Sin embargo, la regla anterior no aplica para el operador -
. Cuando usa a -
todos los valores se convierten en números de acuerdo con el Estándar (ver a continuación). Por lo tanto, en este caso, "5"
se convierte en 5
y luego se resta 1
.
Del estándar:
5 Deje que lnum sea ToNumber (lval).
6 Deje rnum ser ToNumber (rval).
Definición del operador del estándar EcmaScript 262.
Operador + : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1
Operador - : http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.2
La concatenación de cadenas se hace con +
por lo que Javascript convertirá el primer 1 numérico en una cadena y concatenará "1" y "1", haciendo "11".
No puede realizar la resta en cadenas, por lo que Javascript convierte el segundo "1" en un número y resta 1 de 1, lo que da como resultado cero.
No hay un operador dedicado de concatenación de cadenas en JavaScript **. El operador de suma +
realiza una concatenación o suma de cadenas, dependiendo del tipo de operandos:
"1" + 1 // "11"
1 + "1" // "11"
1 + 1 // 2
No hay opuesto a la concatenación (creo) y al operador de resta -
solo realiza la resta independientemente del tipo de operandos:
"1" - 1 // 0
1 - "1" // 0
1 - 1 // 0
"a" - 1 // NaN
** El .
operador en PHP y operador &
en VB son operadores dedicados de concatenación de cadenas.
Porque la especificación dice explícitamente que lo haga. Página 75. Tenga en cuenta la diferencia entre 11.6.1 pasos 5-8 y 11.6.2 pasos 5-7.
11.6.1 - describe cómo funciona el operador de adición
1-4
. ...
5
. Deje que lprim sea ToPrimitive (lval).
6
. Deje que rprim sea ToPrimitive (rval).
7
. Si Tipo (lprim) es Cadena o Tipo (rprim) es Cadena, entonces
7a
. Devuelve la cadena que es el resultado de concatenar ToString (lprim) seguido de ToString (rprim)
8
. Devuelve el resultado de aplicar la operación de adición a ToNumber (lprim) y ToNumber (rprim)
11.6.2 - describe cómo funciona el operador de resta
1-4
. ...
5
. Deje que lnum sea ToNumber (lval).
6
. Deje rnum ser ToNumber (rval).
7
. Devuelve el resultado de aplicar la operación de resta a lnum y rnum
Resumen En caso de que se agregue, si alguno de los operandos convertido en valor primitivo sin ninguna sugerencia se convierte de repente en una cadena, el segundo también se convierte en una cadena. En caso de resta, ambos operandos se convierten a un número.
+
es ambiguo Puede significar "concatenar" o "agregar". Como un lado es una cuerda, se entiende que significa "concatenar", por lo que el resultado es 11 (que, dicho sea de paso, fue uno de mis chistes favoritos cuando era niño. Eso y "1 + 1 = ventana", como se muestra visualmente: │┼│ ニ ⊞
)
-
Sin embargo tiene solo un significado: restar. Por lo tanto, resta.
Este tipo de problema no está presente en otros lenguajes como PHP, donde "concatenar" es .
en lugar de +
, sin ambigüedad. Todavía otros lenguajes como MySQL ni siquiera tienen un operador de concatenación, sino que usan CONCAT(a,b,c...)
.
+
es un operador de suma para variables numéricas y un operador de concatenación para cadenas.
Siempre que haya una cadena después de un +
, Javascript elegirá usar +
como un operador de concatenación y convertirá (tipeado) tantos términos como sea posible alrededor de la cadena para que pueda concatenarlos. Ese es solo el comportamiento de Javascript. (Si console.log(23 + 2 + "." + 1 + 5 + "02" + 02);
obtendrás el resultado 25.15022
. El número 02
fue escrito en la cadena 2
antes de ser concatenado.
-
solo puede ser un operador de resta , por lo que cuando se le da una cadena, cambiará implícitamente el tipo de la cadena "1"
en un 1
numérico; si no lo hizo, no hay forma de que "1" - 1
tenga sentido. Si intentó console.log(23 + 2 + 1 + 5 - "02" + 03);
obtendrás 32 - la cadena 02
se convierte en el número 2
. El término después del -
debe poder convertirse en un número; si console.log(23 - 2 - "." - 1 - 5 - 02 - "02");
obtendrás NaN
devuelto.
Más importante aún, si usted intentó console.log(23 + 2 + "." + 1 + 5 - "02" + 03);
, generará 26.15
, donde todo antes -
fue tratado como una cadena (porque contiene una cadena "."
, y luego el término después de -
se trata como un número.