Estaba practicando JavaScript cuando uno de mis amigos encontró este código JavaScript:
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase()); ¡El código anterior responde "banana" ! ¿Alguien puede explicar por qué?
+'a' se resuelve en NaN ("No es un número") porque convierte una cadena en un número, mientras que el carácter a no se puede analizar como un número.
document.write(+'a');banana . Agregar NaN a "ba" convierte NaN en la cadena "NaN" debido a la conversión de tipo, da baNaN . Y luego hay una a detrás, dando baNaNa .
El espacio entre + + es para hacer que la primera concatenación de una cadena y la segunda un operador unario más (es decir, "positivo"). Tienes el mismo resultado si usas 'ba'+(+'a')+'a' , resuelto como 'ba'+NaN+'a' , que es equivalente a 'ba'+'NaN'+'a' debido para escribir malabares.
document.write('ba'+(+'a')+'a');'b' + 'a' + + 'a' + 'a'...se evalúa como....
'b' + 'a' + (+'a') + 'a'(ver: precedencia de operadores )
(+'a') intenta convertir 'a' en un número usando el operador más unario . Como 'a' no es un número, el resultado es NaN ( "No es un número" ):
'b' + 'a' + NaN + 'a' Aunque NaN significa "No es un número", sigue siendo un tipo numérico; cuando se agrega a cadenas, se concatena como lo haría cualquier otro número:
'b' + 'a' + NaN + 'a' => 'baNaNa'Por último, está en minúsculas:
'baNaNa'.toLowerCase() => 'banana'('b' + 'a' + + 'a' + 'a').toLowerCase() Para mayor claridad, dividamos esto en dos pasos. Primero, obtenemos el valor de la expresión entre paréntesis y luego aplicamos la función toLowerCase() al resultado.
'b' + 'a' + + 'a' + 'a'Yendo LR , tenemos:
'b' + 'a' devuelve ba , esta es una 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 da como resultado baNaN .baNaN + 'a' devuelve baNaNa . Nuevamente, esta es una concatenación regular.En esta etapa, el resultado del primer paso es baNaNa .
Aplicar .toLowerCase() en el valor devuelto del paso uno da:
Plátano
Hay muchos juegos de palabras similares en JavaScript que puedes consultar.