Array.prototype.splice - 帮助理解课程

Jul*_*ius 9 javascript

这是教程中的一个函数:

function add() {
    var values = Array.prototype.splice.call(arguments, [1]),
        total = 0;

    for(var value of values) {
        total += value;
    }

    return total;
}
Run Code Online (Sandbox Code Playgroud)

资源

这个表达Array.prototype.splice.call(arguments, [1])让我很困惑.

  1. 为什么1
  2. 为什么用括号[1]

如果我们传递1,它表示start位置splice(),所以它将跳过我们传递给的第一个参数add(),因此它不会添加所有参数......

这是教程中的错误吗?

Mik*_*red 6

是的,这个例子是错的,如果你尝试的代码不起作用(它会忽略第一个参数),就像你说的那样.如果该行是:

var values = Array.prototype.slice.call(arguments),
Run Code Online (Sandbox Code Playgroud)

要么

var values = Array.prototype.splice.call(arguments, 0),
Run Code Online (Sandbox Code Playgroud)


Grz*_*ski 2

我的猜测:该示例是通过简单地查找另一个函数的代码而创建的,该函数具有一个特殊参数,并且使用它apply而不是call在 ES5 语法中使用。

在本教程的后续部分中,将讨论计算函数,其第一个参数确定要执行的计算类型。如果您使用 ES5 语法编写它们,则必须删除第一个参数。这解释了为什么 1 - 删除第一个参数。现在,为什么要加括号:JS 中有两个几乎相同的函数:callapply。请参阅此注释apply

虽然该函数的语法与 call() 几乎相同,但根本区别在于 call() 接受参数列表,而 apply() 接受单个参数数组。

我认为计算函数的作者错误地使用了 for 的语法apply,因此使用了括号。