任何人都可以详细解释这行代码中的每个术语实际上做了什么吗?我知道这是将参数对象转换为一个真正的数组,但我不明白它是如何做到的。JavaScript参数对象MDN指南
var args = (arguments.length === 1?[arguments[0]]:Array.apply(null, arguments));
任何人都可以详细解释这行代码中的每个术语实际上做了什么吗?我知道这是将参数对象转换为一个真正的数组,但我不明白它是如何做到的。JavaScript参数对象MDN指南
var args = (arguments.length === 1?[arguments[0]]:Array.apply(null, arguments));
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 parameters和spread operator以更简单的方式完成。以下是ES2015的等价物:
function someFunc(...args) {
return args;
}
someFunc(1,2,3); //[1, 2, 3]
虽然你所说的一切都是正确的,并且演示了这样做的正确方法,但你的帖子并不回答这个问题。 – Bergi
我开始在OP编辑之前将答案放在一起,其中添加了代码示例。因为我没有这个上下文,所以我演示了一个简单的例子,就如何从一个参数对象创建一个数组。 – Maverick976
谢谢Maverick976的回答和解释,但如前所述,代码后来出现了,我的借口和答案是不同的。 –
无论你找到那个代码,扔掉它。越远越好。而是使用惯用的[标准方法](http://stackoverflow.com/q/960866/1048572)。 – Bergi
哪个术语完全不清楚? – Bergi
为什么?这是对代码的苛刻反应。我不明白以下部分:arguments.length === 1?[arguments [0]]: –