2013-07-25 50 views
0

有人告诉我,它使'arguments'对象成为一个真数组并且也用于创建一个现有数组的副本是有用的。但是,是否需要转换为类似数组的对象?这样做的好处是什么?将函数的参数转换为类似数组的对象

function toArray(obj) { 
    return Array.prototype.slice.call(obj); 
} 

function bind(scope, fn) { 
    return function() { 
     // why not just return fn.apply(scope, arguments); ? 
     return fn.apply(scope, toArray(arguments)); 
    }; 
} 

我知道的好东西“参数”对象是它所包含的“长度”属性,所以我们可以转换为类似数组的对象,但是当我通过在物体通过像

测试它
x = { 
    'a': 'a', 
    'tt': 'tt', 
    '2':'2', 
     length:3 
}; 

toArray(x); // [undefined x 2, 2] 

它返回一个数组,其中undefined元素,是因为他们的键不是数字吗?

+1

*“为什么不'返回fn.apply(范围,参数);'” * ...鉴于你的榜样,这正是你应该做的。没有理由在这里执行'toArray(arguments)',除非你想传递参数的一个子集。 –

+0

...它看起来像你的例子是一种*“迷你绑定”*功能。在一个典型的'.bind()'中,可以将'.concat()'传递的'arguments'到绑定的'arguments'的末尾,这需要一个数组来将这两个数组扁平化为一个扁平数组。像:'re​​turn fn.apply(scope,orig_args.concat(toArray(arguments)));' –

+0

@CrazyTrain什么是orig_args?你可以举一个例子: – peter

回答

0

,如果你做了:

x={1:1,2:1,0:55,length:3}; 
toArray(x); 

// result [55, 1, 1] 

一个数组是要期待的钥匙,是数字。 如此这般通过外观在0 ...未定义 着眼于1 ...不确定 着眼于2 ...“2”

所以,是的,那是因为他们的钥匙是不是数字。

希望这有助于