2011-06-23 7 views
8

Si los argumentos son solo un objeto con una propiedad de longitud, entonces ¿por qué parece comportarse de manera diferente a otros objetos que no son de matriz con respecto a, digamos, Array.prototype.slice?Dado que "argumentos" no es una matriz verdadera, ¿por qué funciona Array.prototype.slice.call (arguments), pero Array.prototype.slice.call (someobject) no funciona?

Por ejemplo, el siguiente código primero alerta "indefinido", y luego alerta "foo". ¿Por qué difieren?

(function(a){ 
    var myobj = {0 : "foo"}; 
    var myobjarray = Array.prototype.slice.call(myobj); 
    var argumentsarray = Array.prototype.slice.call(arguments); 
    alert(myobjarray.shift()); 
    alert(argumentsarray.shift()); 
})("foo"); 

Respuesta

8

que funciona si el objeto tiene una propiedad length.

var myobj = { 0: "foo", 1: "bar", length: 2 }; 
var myobjarray = [].slice.call(myobj); 
alert(myobjarray.shift()); 

La mayoría de los métodos de matriz se basan en la propiedad de longitud. Si intentas ejecutar un método Array en un objeto que no expone la interfaz esperada, obtendrás resultados inesperados.

Cuestiones relacionadas