Estaba practicando JavaScript cuando uno de mis amigos se encontró con este código JavaScript:
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
¡El código anterior responde "banana"
! ¿Alguien puede explicar por qué?
javascript
type-conversion
HV Sharma
fuente
fuente
+"a"
esNaN
.+'a'
solo y vea qué sucede.Respuestas:
+'a'
se resuelve enNaN
("No es un número") porque obliga a una cadena a un número, mientras que el caráctera
no se puede analizar como un número.banana
.Agregar
NaN
a"ba"
vueltasNaN
en la cadena"NaN"
debido a la conversión de tipo, dabaNaN
. Y luego hay una
trasero, dandobaNaNa
.El espacio intermedio
+ +
es hacer que la primera concatenación de cadenas y la segunda sean un operador unario más (es decir, "positivo"). Tiene el mismo resultado si usa'ba'+(+'a')+'a'
, resuelto como'ba'+NaN+'a'
, que es equivalente a'ba'+'NaN'+'a'
debido al malabarismo de tipos.fuente
... se evalúa como ...
(ver: precedencia del operador )
(+'a')
intenta convertir'a'
a un número utilizando el operador unario más . Como'a'
no es un número, el resultado esNaN
( "No es un número" ):Aunque
NaN
significa "No es un número", sigue siendo un tipo numérico ; cuando se agrega a las cadenas, se concatena como cualquier otro número:Finalmente, está en minúsculas:
fuente
Para mayor claridad, dividamos esto en dos pasos. Primero, obtenemos el valor de la expresión entre paréntesis y luego aplicamos la
toLowerCase()
función en el resultado.Paso uno
Yendo a LR , tenemos:
'b' + 'a'
devuelve ba , esto es concatenación regular.ba + + 'a'
intenta concatenar ba con+ 'a'
. Sin embargo, dado que el operador unario+
intenta convertir su operando en un número, se devuelve el valor NaN , que luego se convierte en una cadena cuando se concatena con el ba original , lo que resulta en baNaN .baNaN
+ 'a' devuelve baNaNa . De nuevo, esto es concatenación regular.Segundo paso
Aplicar
.toLowerCase()
sobre el valor devuelto desde el paso uno da:Hay muchos juegos de palabras similares en JavaScript que puedes consultar.
fuente
Es solo por el operador + .
Podemos obtener más conocimiento de parte de él.
Por ejemplo
Puede convertir una cadena en número de 2 maneras:
Así que volvamos a la consulta original; Aquí intenta convertir el siguiente carácter ('a') en el número, pero de repente recibimos el error NaN,
Pero se trata como una cadena porque el carácter anterior estaba en la cadena. Así será
Y por último lo convierte a LowCase (), por lo que sería banana
Si se le pone un número al lado, su resultado cambiará.
Sería 'ba1a'
fuente
Esta línea de código evalúa una expresión y luego llama a un método basado en el valor devuelto.
La expresión
('b' + 'a' + + 'a' + 'a')
se compone únicamente de literales de cadena y operadores de suma.Una acción implícita tomada es la llamada a ToNumber en una cadena
El intérprete tiene reglas sobre cómo analizar la expresión, desglosándola en sus componentes de expresiones de mano izquierda y derecha.
Paso 1:
'b' + 'a'
Expresión izquierda:
'b'
Valor izquierdo: 'b'
Operador: + (uno de los lados de la expresión es una cadena, por lo que la concatenación de cadenas)
Expresión correcta:
'a'
Valor correcto: 'a'Resultado:
'ba'
Paso 2:
'ba' + + 'a'
Expresión izquierda:
'ba'
Valor izquierdo: 'ba'
Operador: + (uno de los lados de la expresión es una cadena, por lo que la concatenación de cadenas)
Expresión derecha:
+ 'a'
(esto evalúa el valor matemático del carácter 'a' suponiendo que es un número positivo del signo +; el signo menos también habría funcionado aquí indicando un número negativo, lo que da como resultado NaN)Valor correcto: NaN (debido a que el operador es la concatenación de cadenas, toString se llama a este valor durante la concatenación)
Resultado: 'baNaN'
Paso 3:
'baNaN' + 'a'
Expresión izquierda:
'baNaN'
Valor izquierdo: 'baNaN'
Operador: + (uno de los lados de la expresión es una cadena, por lo que la concatenación de cadenas)
Expresión correcta:
'a'
Valor correcto: 'a'
Resultado: 'baNaNa'
Después de esto, se ha evaluado la expresión de agrupación y se llama a toLowerCase, que nos deja con banana.
fuente
¡Usar + convertirá cualquier valor a Número en JavaScript!
Entonces...
Lo principal aquí para saber primero y aprender es usar
+
antes de cualquier valor en JavaScript, convertirá ese valor en un número , pero si ese valor no se puede convertir, el motor de JavaScript devolverá NaN , lo que significa que no es un número (no puede se convertirá en un número, amigo!) y el resto de la historia de la siguiente manera:fuente
Lea más sobre NaN en W3Schools o Mozilla Developer Network
fuente
Mira la magia aquí. El segundo plus es un operador unario que da 'NaN'
fuente