575 votos

¿Por qué el resultado de ('b'+'a'+ + 'a' + 'a').método tolowercase() 'banana'?

Yo estaba practicando algo de JavaScript cuando uno de mis amigos llegó a través de este código JavaScript:

document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());

El código de arriba respuestas "banana"! ¿Alguien puede explicar por qué?

567voto

SOFe Puntos 2596

+'a' resuelve NaN ("No es un Número"), ya que convierte una cadena a un número, mientras que el carácter a no puede ser analizado como un número.

document.write(+'a');

A minúsculas se vuelve banana.

Añadiendo NaN a "ba" vueltas NaN en la cadena "NaN" debido al tipo de conversión, da baNaN. Y luego hay un a detrás, dándole baNaNa.

El espacio entre + + es para hacer la primera cadena de la concatenación y la segunda una unario plus (es decir, "positivo") del operador. Usted tiene el mismo resultado si se utiliza 'ba'+(+'a')+'a', resuelto como 'ba'+NaN+'a', que es equivalente a 'ba'+'NaN'+'a' debido al tipo de malabares.

document.write('ba'+(+'a')+'a');

90voto

Tyler Roper Puntos 11618
'b' + 'a' + + 'a' + 'a'

...es evaluado como....

('b') + ('a') + (+'a') + ('a')

(ver: la precedencia de operadores)

(+'a') intenta convertir 'a' en número con el único operador más. Porque '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", es una numérico tipo; cuando se añade a las cadenas, se concatena al igual que cualquier otro número:

'b'  +  'a'  +  NaN  + 'a'  =>  'baNaNa'

Por último, es convertidas a minúsculas:

'baNaNa'.toLowerCase()      =>  'banana'

36voto

Taslim Puntos 1223
('b' + 'a' + + 'a' + 'a').toLowerCase()

Para mayor claridad, vamos a descomponerlo en dos pasos. En primer lugar, obtenemos el valor de la expresión entre paréntesis y, a continuación, se aplica el toLowerCase() función en el resultado.

Paso uno

'b' + 'a' + + 'a' + 'a'

Va L-R, tenemos:

  • 'b' + 'a' devuelve ba, esta es la concatenación.
  • ba + + 'a' intenta concatenar ba con + 'a'. Sin embargo, dado que el operador unario + intenta convertir su operando en un número, el valor NaN se devuelve, que entonces se convierte en una cadena cuando se concatena con el original de la ba - lo que resulta en la baNaN.
  • baNaN + 'a' devuelve plátano. De nuevo, esta es la concatenación.

En esta etapa, el resultado del paso uno es el plátano.

Paso dos

La aplicación de .toLowerCase() sobre el valor devuelto de paso que uno da:

banana

Hay muchos juegos de palabras similares en JavaScript que usted puede comprobar hacia fuera.

24voto

Neel Rathod Puntos 1388

Es sólo porque de + operador.

Podemos obtener un mayor conocimiento de pedazo él.

=> ( ('b') + ('a') + (++) + ('a') + ('a'))
=> ( ('b') + ('a') + (+) + ('a') + ('a')) // Here + + convert it to +operator 
Which later on try to convert next character to the number.

Por ejemplo

const string =  '10';

Usted puede convertir una cadena en número de 2 maneras:

  1. Número(cadena);
  2. +cadena;

Así que de vuelta a la consulta original; Aquí se intenta convertir el siguiente char ('a') para el número, pero de repente nos obtenido un error NaN,

( ('b') + ('a') + (+'a') + ('a'))
( ('b') + ('a') + NaN + ('a'))

Pero se trata como una cadena, porque el carácter anterior fue en la cadena. Así será

( ('b') + ('a') + 'NaN' + ('a'))

Y por último se convierte en método tolowercase(), por Lo que sería banana

Si se le puso número a su lado, Su resultado va a ser el cambio.

( 'b' + 'a' +  + '1' + 'a' ) 

Sería 'ba1a'

const example1 = ('b' + 'a' + + 'a' + 'a').toLowerCase(); // 'banana' 
const example2 = ('b' + 'a' + + '1' + 'a').toLowerCase(); // 'ba1a'
console.log(example1);
console.log(example2);

9voto

Travis J Puntos 28588

Esta línea de código se evalúa una expresión y, a continuación, llama a un método basado en el valor devuelto.

La expresión ('b' + 'a' + + 'a' + 'a') está únicamente compuesta de los literales de cadena y, además de los operadores.

Una forma implícita de la acción tomada es la llamada para ToNumber en una cadena

  • ToNumber Aplica para el Tipo de Cadena "ToNumber aplicados a Cadenas se aplica la gramática a la Cadena de entrada. Si la gramática no puede interpretar la Cadena como una expansión de StringNumericLiteral, entonces el resultado de ToNumber es NaN."

El intérprete tiene reglas de cómo analizar la expresión, descomponiéndolo en sus componentes de izquierda a derecha y expresiones.


Paso 1: 'b' + 'a'

A La Izquierda De La Expresión: 'b'
A la izquierda de Valor: 'b'

Operador: + (uno de la expresión lados es una cadena, por lo que la concatenación de cadenas)

A La Derecha De La Expresión: 'a' A la derecha de Valor: 'a'

Resultado: 'ba'


Paso 2: 'ba' + + 'a'

A La Izquierda De La Expresión: 'ba'
A la izquierda de Valor: 'ba'

Operador: + (uno de la expresión lados es una cadena, por lo que la concatenación de cadenas)

A la derecha de la Expresión: + 'a' (esto evalúa las Matemáticas Valor de la letra 'a' suponiendo que es un número positivo de la señal de + -- el signo de menos, también habría trabajado aquí, lo que indica un número negativo-que los resultados en NaN)
A la derecha de Valor: NaN (debido a que el operador de concatenación de cadenas, toString se llama en este valor durante la concatenación)

Resultado: 'baNaN'


Paso 3: 'baNaN' + 'a'

A La Izquierda De La Expresión: 'baNaN'
A la izquierda de Valor: 'baNaN'

Operador: + (uno de la expresión lados es una cadena, por lo que la concatenación de cadenas)

A La Derecha De La Expresión: 'a'
A la derecha de Valor: 'a'

Resultado: 'baNaNa'


Después de esto la agrupación de expresión ha sido evaluado, y el método tolowercase se llama lo que nos deja con plátano.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X