2012-02-15 14 views
9

Al agregar dos matrices vacías: [] + [] da como resultado una cadena vacía. ¿Por qué?¿Por qué el resultado de agregar dos matrices vacías en JavaScript es una cadena?

Y cualquier enlace en una colección de características extrañas como esta?

+0

Hay un screencast de una sesión de conferencia reciente que explora comportamientos extraños de Ruby y Javascript, pero según tengo entendido, las idiosincrasias de Javascript son específicas de la implementación. –

+5

Una vez escribí esta parte de una respuesta más amplia [aquí] (http://stackoverflow.com/questions/7202157/can-you-explain-why-10/7202287#7202287). – pimvdb

+0

@BrianDriscoll, esa es la razón por la que hago la pregunta. –

Respuesta

12

El operador + solo existe para texto y cadenas. Cuando lo usa en otro tipo, JavaScript intenta convertir el tipo (primero en cadena, luego int).

Cuando las matrices se lanzan a las cadenas, se envían como cadenas separadas por comas.

Por lo tanto, [] + [] =>"" + "" =>".

Otro ejemplo: [1,2] + [3,4] =>"1,2" + "3,4" =>"1,23,4"

Spec pertinente:http://es5.github.com/#x11.6.1

+2

Buena respuesta. El enlace a la sección relevante de la especificación no dolería. La importancia de "first to string" se puede resaltar así: '[3] + [3] //" 33 "' –

+0

@GGG: Estoy tratando de encontrarlo en la especificación :-P –

+0

@GGG: Found it http://es5.github.com/#x11.6.1 –

0

Especulación, pero supongo que JavaScript está intentando concatenación allí, en lugar de additon.

3

Debido a que el operador + serializa las dos matrices y concatena los dos resultados. La serialización se realiza mediante el método Array.prototype.toString que básicamente hace lo siguiente:

function() { return this.join(','); } 

Las dos matrices están vacías, por lo que la cadena devuelta por toString también está vacía y dos cadenas vacías hacen una cadena vacía también.

0

El operador + intentará convertir la matriz en cadena. Utilice el comando concat, si desea unir dos o más matrices.

1

En JavaScript, hay dos tipos de valores; primitivas que incluyen null, undefined, boolean, string y number, todo lo demás es una object incluyendo array

Al añadir cosas, JavaScript convierte los valores a números, cadenas o primitivas. JavaScript interno, usa el método toPrimitive para convertir variables a primitivas.

Aquí es la firma de toPrimitive

toPrimitive(input, preferedType); 

Con:

[] + [] 

JS convierte [] a una primitiva, primero intenta valueOf() que devuelve el array:

var arr = []; 
arr.valueOf() === arr // true 

Como ese resultado no es un primitivo, toString() se llama y devuelve la cadena vacía (la cadena es primitiva). Por lo tanto, el resultado de [] + [] es la concatenación de dos cadenas vacías.

Cuestiones relacionadas