鉴于"arguments"不是一个真正的数组,为什么Array.prototype.slice.call(arguments)工作,但是Array.prototype.slice.call(someobject)不起作用?

zjm*_*ler 9 javascript arrays

如果参数只是一个具有length属性的对象,那么为什么它看起来与其他非数组对象的行为不同,例如Array.prototype.slice.

例如,以下代码首先警告"未定义",然后警告"foo".为什么这些不同?

(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");
Run Code Online (Sandbox Code Playgroud)

gil*_*ly3 8

如果您的对象具有length属性,则它可以工作.

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

大多数Array方法都依赖于length属性.如果您尝试在不公开预期接口的对象上执行Array方法,则会得到意外结果.