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?
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?
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
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 "' –
@GGG: Estoy tratando de encontrarlo en la especificación :-P –
@GGG: Found it http://es5.github.com/#x11.6.1 –
Especulación, pero supongo que JavaScript está intentando concatenación allí, en lugar de additon.
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.
El operador + intentará convertir la matriz en cadena. Utilice el comando concat, si desea unir dos o más matrices.
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.
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. –
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
@BrianDriscoll, esa es la razón por la que hago la pregunta. –