Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Given that "arguments" is not a true array, why does Array.prototype.slice.call(arguments) work, but Array.prototype.slice.call(someobject) not work?

If the arguments is just an object with a length property, then why does it seem to behave differently from other non-array objects with respect to, say, Array.prototype.slice.

For example, the following code first alerts "undefined", and then alerts "foo". Why do these differ?

(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");
like image 389
zjmiller Avatar asked Jun 23 '11 20:06

zjmiller


1 Answers

It works if your object has a length property.

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

Most Array methods rely on the length property. If you try to execute an Array method on an object that doesn't expose the expected interface, you'll get unexpected results.

like image 138
gilly3 Avatar answered Nov 07 '22 17:11

gilly3