diff --git a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md index 48a2a8c13e..a6efac76ee 100644 --- a/1-js/06-advanced-functions/02-rest-parameters-spread/article.md +++ b/1-js/06-advanced-functions/02-rest-parameters-spread/article.md @@ -4,15 +4,15 @@ 例如: -- `Math.max(arg1, arg2, ..., argN)` —— 返回入参中的最大值。 +- `Math.max(arg1, arg2, ..., argN)` —— 返回参数中的最大值。 - `Object.assign(dest, src1, ..., srcN)` —— 依次将属性从 `src1..N` 复制到 `dest`。 - ……等。 -在本章中,我们将学习如何编程实现支持函数可传入任意数量的参数。以及,如何将数组作为参数传递给这类函数。 +在本章中,我们将学习如何编写支持传入任意数量参数的函数,以及如何将数组作为参数传递给这类函数。 ## Rest 参数 `...` -在 JavaScript 中,无论函数是如何定义的,你都可以使用任意数量的参数调用函数。 +在 JavaScript 中,无论函数是如何定义的,你都可以在调用它时传入任意数量的参数。 例如: ```js run @@ -23,9 +23,9 @@ function sum(a, b) { alert( sum(1, 2, 3, 4, 5) ); ``` -虽然这里不会因为传入“过多”的参数而报错。但是当然,在结果中只有前两个参数被计算进去了。 +虽然这里这个函数不会因为传入过多的参数而报错。但是,当然,只有前两个参数被求和了。 -Rest 参数可以通过使用三个点 `...` 并在后面跟着包含剩余参数的数组名称,来将它们包含在函数定义中。这些点的字面意思是“将剩余参数收集到一个数组中”。 +我们可以在函数定义中声明一个数组来收集参数。语法是这样的:`...变量名`,这将会声明一个数组并指定其名称,其中存有剩余的参数。这三个点的语义就是“收集剩余的参数并存进指定数组中”。 例如,我们需要把所有的参数都放到数组 `args` 中: @@ -43,9 +43,9 @@ alert( sumAll(1, 2) ); // 3 alert( sumAll(1, 2, 3) ); // 6 ``` -我们也可以选择获取第一个参数作为变量,并将剩余的参数收集起来。 +我们也可以选择将第一个参数获取为变量,并将剩余的参数收集起来。 -下面的例子把前两个参数定义为变量,并把剩余的参数收集到 `titles` 数组中: +下面的例子把前两个参数获取为变量,并把剩余的参数收集到 `titles` 数组中: ```js run function showName(firstName, lastName, ...titles) { @@ -70,12 +70,12 @@ function f(arg1, ...rest, arg2) { // arg2 在 ...rest 后面?! } ``` -`...rest` 必须处在最后。 +`...rest` 必须写在参数列表最后。 ```` ## "arguments" 变量 -有一个名为 `arguments` 的特殊的类数组对象,该对象按参数索引包含所有参数。 +有一个名为 `arguments` 的特殊类数组对象可以在函数中被访问,该对象以参数在参数列表中的索引作为键,存储所有参数。 例如: @@ -96,11 +96,11 @@ showName("Julius", "Caesar"); showName("Ilya"); ``` -在过去,JavaScript 中没有 rest 参数,而使用 `arguments` 是获取函数所有参数的唯一方法。现在它仍然有效,我们可以在一些老代码里找到它。 +在过去,JavaScript 中不支持 rest 参数语法,而使用 `arguments` 是获取函数所有参数的唯一方法。现在它仍然有效,我们可以在一些老代码里找到它。 但缺点是,尽管 `arguments` 是一个类数组,也是可迭代对象,但它终究不是数组。它不支持数组方法,因此我们不能调用 `arguments.map(...)` 等方法。 -此外,它始终包含所有参数,我们不能像使用 rest 参数那样只截取入参的一部分。 +此外,它始终包含所有参数,我们不能像使用 rest 参数那样只截取参数的一部分。 因此,当我们需要这些功能时,最好使用 rest 参数。 @@ -126,7 +126,7 @@ f(1); // 1 我们刚刚看到了如何从参数列表中获取数组。 -不过有时候我们也需要做与之相反的事儿。 +有时候我们也需要做与之相反的事。 例如,内建函数 [Math.max](mdn:js/Math/max) 会返回参数中最大的值: @@ -134,9 +134,9 @@ f(1); // 1 alert( Math.max(3, 5, 1) ); // 5 ``` -假如我们有一个数组 `[3, 5, 1]`,我们该如何用它调用 `Math.max` 呢? +如果我们有一个数组 `[3, 5, 1]`,我们该如何用它调用 `Math.max` 呢? -直接把数组“原样”传入是不会奏效的,因为 `Math.max` 希望你传入一个列表形式的数值型参数,而不是一个数组: +直接“原样”传入这个数组是不会奏效的,因为 `Math.max` 期望的是列表形式的数值型参数,而不是一个数组: ```js run let arr = [3, 5, 1]; @@ -146,9 +146,9 @@ alert( Math.max(arr) ); // NaN */!* ``` -毫无疑问,我们不可能手动地去一一设置参数 `Math.max(arg[0], arg[1], arg[2])`,因为我们不确定这儿有多少个。在脚本执行时,可能参数数组中有很多个元素,也可能一个都没有。并且这样设置的代码也很丑。 +毫无疑问,我们不能手动地去一一设置参数 `Math.max(arg[0], arg[1], arg[2])`,因为我们不确定这儿有多少个。在代码执行时,参数数组中可能有很多个元素,也可能一个都没有。而且,这样的代码也很不优雅。 -**Spread 语法** 来帮助你了!它看起来和 rest 参数很像,也使用 `...`,但是二者的用途完全相反。 +**Spread 语法** 可以解决这个问题!它看起来和 rest 参数很像,也使用 `...`,但是二者的用途完全相反。 当在函数调用中使用 `...arr` 时,它会把可迭代对象 `arr` “展开”到参数列表中。 @@ -160,7 +160,7 @@ let arr = [3, 5, 1]; alert( Math.max(...arr) ); // 5(spread 语法把数组转换为参数列表) ``` -我们还可以通过这种方式传递多个可迭代对象: +我们还可以通过这种方式传入多个可迭代对象: ```js run let arr1 = [1, -2, 3, 4]; @@ -192,7 +192,7 @@ let merged = [0, ...arr, 2, ...arr2]; alert(merged); // 0,3,5,1,2,8,9,15(0,然后是 arr,然后是 2,然后是 arr2) ``` -在上面的示例中,我们使用数组展示了 spread 语法,其实任何可迭代对象都可以。 +在上面的示例中,我们使用数组展示了 spread 语法,其实我们可以用 spread 语法这样操作任何可迭代对象。 例如,在这儿我们使用 spread 语法将字符串转换为字符数组: @@ -273,12 +273,12 @@ alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4} alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} ``` -这种方式比使用 `let arrCopy = Object.assign([], arr)` 来复制数组,或使用 `let objCopy = Object.assign({}, obj)` 来复制对象写起来要短得多。因此,只要情况允许,我们更喜欢使用它。 +这种方式比使用 `let arrCopy = Object.assign([], arr)` 复制数组,或使用 `let objCopy = Object.assign({}, obj)` 复制对象来说更为简便。因此,只要情况允许,我们倾向于使用它。 ## 总结 -当我们在代码中看到 `"..."` 时,它要么是 rest 参数,要么就是 spread 语法。 +当我们在代码中看到 `"..."` 时,它要么是 rest 参数,要么是 spread 语法。 有一个简单的方法可以区分它们: @@ -288,8 +288,8 @@ alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3} 使用场景: - Rest 参数用于创建可接受任意数量参数的函数。 -- Spread 语法用于将数组传递给通常需要含有许多参数的列表的函数。 +- Spread 语法用于将数组传递给通常需要含有许多参数的函数。 -它们俩的出现帮助我们轻松地在列表和参数数组之间来回转换。 +我们可以使用这两种语法轻松地互相转换列表与参数数组。 -“旧式”的 `arguments`(类数组且可迭代的对象)也依然能够帮助我们获取函数调用中的所有参数。 +旧式的 `arguments`(类数组且可迭代的对象)也依然能够帮助我们获取函数调用中的所有参数。