2016-02-25 76 views
0

任何人都可以详细解释这行代码中的每个术语实际上做了什么吗?我知道这是将参数对象转换为一个真正的数组,但我不明白它是如何做到的。JavaScript参数对象MDN指南

var args = (arguments.length === 1?[arguments[0]]:Array.apply(null, arguments)); 
+0

无论你找到那个代码,扔掉它。越远越好。而是使用惯用的[标准方法](http://stackoverflow.com/q/960866/1048572)。 – Bergi

+0

哪个术语完全不清楚? – Bergi

+0

为什么?这是对代码的苛刻反应。我不明白以下部分:arguments.length === 1?[arguments [0]]: –

回答

-1
function someFunc() { 
    var args = Array.prototype.slice.call(arguments); 
    return args; 
} 
someFunc(1,2,3); //[1, 2, 3] 

arguments目的是类似阵列的物体(未数组)本地的每个功能和包含用于传递到函数每个参数的条目。我们使用Array.prototype来创建一个数组的实例。它也可以这样写var args = [].slice.call(arguments);

然后我们使用slice()方法。只要您将方法绑定到对象,切片就可以用于类似数组的对象(本例中为我们的arguments对象)。对于这种情况下的绑定,我们使用call()。您还可以使用其他绑定功能,例如apply()

call()方法需要arguments对象,这是为slice()提供的this值。

值得注意的是,在EcmaScript 2015中,这可以使用Rest parametersspread operator以更简单的方式完成。以下是ES2015的等价物:

function someFunc(...args) { 
    return args; 
} 
someFunc(1,2,3); //[1, 2, 3] 
+0

虽然你所说的一切都是正确的,并且演示了这样做的正确方法,但你的帖子并不回答这个问题。 – Bergi

+0

我开始在OP编辑之前将答案放在一起,其中添加了代码示例。因为我没有这个上下文,所以我演示了一个简单的例子,就如何从一个参数对象创建一个数组。 – Maverick976

+0

谢谢Maverick976的回答和解释,但如前所述,代码后来出现了,我的借口和答案是不同的。 –