鉴于“参数”不是真正的数组,为什么Array.prototype.slice.callarguments可以工作,但是Array.prototype.slice.callsomeobject不能工作?

问题描述

| 如果参数只是一个具有length属性的对象,那么为什么它在Array.prototype.slice方面的表现与其他非数组对象不同。 例如,以下代码首先警告\“ undefined \”,然后警告\“ 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\");
    

解决方法

        如果您的对象具有
length
属性,它将起作用。
var myobj = { 0: \"foo\",1: \"bar\",length: 2 };
var myobjarray = [].slice.call(myobj);
alert(myobjarray.shift());
大多数Array方法都依赖于length属性。如果您尝试在不公开预期接口的对象上执行Array方法,则会得到意外的结果。