有人能详细解释这行代码中的每个术语实际上做了什么吗?我知道这是将arguments对象转换为一个真正的数组,但我不明白它是如何做的。
var args = (arguments.length === 1?[arguments[0]]:Array.apply(null, 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()
方法。只要将方法绑定到对象,Slice就可以用于类似数组的对象(在本例中是我们的arguments
对象)。对于这种情况下的绑定,我们使用call()
。您还可以使用其他绑定函数,例如apply()
。
call()
方法接收arguments
对象,即为this
提供的slice()
值。
值得注意的是,在EcmaScript 2015中,可以使用Rest parameters和spread operator以更简单的方式完成此操作。以下是ES2015的等效内容:
function someFunc(...args) {
return args;
}
someFunc(1,2,3); //[1, 2, 3]