鉴于“arguments”不是真正的数组,为什么Array.prototype.slice.call(arguments)有效,但Array.prototype.slice.call(someobject)无效?

9
如果参数只是一个具有长度属性的对象,那么为什么它在某些方面似乎与其他非数组对象(如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");
1个回答

8

如果您的对象具有length属性,则此方法可用。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接