2010-11-22 10 views
12

Es muy común en Javascript encontrar objetos tipo Array con algunas similitudes con la construcción en tipo Array, pero sin todos sus métodos o características. Tanto es así que hay algunos trucos para convertir objetos parecidos a Array en matrices "reales" para una mayor manipulación.¿Por qué se utilizan objetos similares a un array en JavaScript en matrices nativas?

Esto incluso se menciona en Javascript: The Definitive Guide.

La pregunta es por qué es este patrón tan común? ¿Por qué no preferir el tipo de matriz incorporada en todos estos casos?

+0

Posiblemente una pregunta relacionada: http://stackoverflow.com/questions/ 1971389/array-like-object-in-javascript –

+0

Por ejemplo: 'arguments' está diseñado para ser inmutable. Ese no sería el caso si fuera una matriz. – jwueller

+1

@elusive, el objeto 'arguments' es mutable, puede cambiar el valor de sus propiedades. Las propiedades con nombre de índice están * vinculadas * a FormalParameters de la función, si cambia el valor de 'arguments [0]', el cambio se reflejará en el primer parámetro nombrado de la función. El modo estricto en ECMAScript 5 introduce algunas restricciones, pero el objeto aún se puede modificar. – CMS

Respuesta

7

Bueno, hablando de core objetos de Javascript, el arguments es un buen ejemplo para hablar.

En este caso, ha sido un objeto similar a una matriz desde el principio, apareció en la Especificación ECMAScript 1ª Edición ya como un objeto simple.

¿Por qué? Creo que en ese momento solo había cuatro métodos integrados Array, y tal vez el diseñador no creía que esto supusiera demasiado, más tarde se propuso el cambio, pero Microsoft (parte del comité TC39) no aprobó el cambio, el miedo a rompiendo la web siempre ha estado presente.

Ahora va a objetos anfitrión, el DOM, NodeLists vienen a la mente, creo que no querían utilizar el tipo nativo Array debido al comportamiento dinámico de estos objetos.

NodeLists generalmente son vivo objetos, su estructura se refleja ningún cambio en la estructura del DOM subyacente ...

Personalmente me gusta matriz de objetos, porque son muy ligeros, antes de ECMAScript 5, hubo una gran cantidad de restricciones en los métodos centrales, con respecto al uso de objetos parecidos a un array definidos por el usuario.

Por ejemplo, el método de objetos de función apply, en ECMAScript < = 3, sólo se permite ya sea una matriz real o un argumentos objeto como su segundo argumento, ahora en ES5, la siguiente es posible:

var arrayLike = {0: 'hello ', 1:'world', length:2}; 
(function (a,b) { alert(a+b); }).apply(null, arrayLike); 

Consulte también:

+0

Sospecho que la objeción principal para convertir 'arguments' en' Array' es que haría un uso de 'arguments' * aún más difícil * para optimizar de lo que ya es. – Gabe

+2

@Gabe: Bueno, en las últimas discusiones antes de que se aceptara ES5, la optimización no era el problema, el problema era la compatibilidad con versiones anteriores, específicamente con los métodos 'toString' y' toLocaleString'. El cambio incluso llegó al estado de borrador, pero no fue realmente directo, usaron un objeto 'Array', pero definieron dos propiedades propias (' toString' y 'toLocaleString') apuntando a los métodos en' Object.prototype' . Después de un tiempo, el cambio se eliminó del borrador de ES5. Al final, los problemas de optimización con respecto al objeto 'arguments' se resuelven en el modo estricto de ES5. – CMS

Cuestiones relacionadas