在Javascript函数中使用新的ES2015 rest参数而不是使用数组参数有什么好处?

在Javascript函数中使用新的ES2015 rest参数而不是使用数组参数有什么好处?,javascript,ecmascript-6,Javascript,Ecmascript 6,首先介绍一些背景: 在ES2015中,引入了许多新的javascript特性 其中包括rest参数,使函数能够接受 不确定的参数数量,同时避免一些不良做法 就像使用函数的arguments属性一样 在这些示例中,我们有两个js函数执行完全相同的操作: 接受无限数量的参数 新方法: (…args)=>将Rest参数args视为数组 可以通过以下方式调用此函数: foo("a","b","c","d"); //re

首先介绍一些背景:

在ES2015中,引入了许多新的javascript特性 其中包括rest参数,使函数能够接受 不确定的参数数量,同时避免一些不良做法 就像使用函数的arguments属性一样

在这些示例中,我们有两个js函数执行完全相同的操作:

接受无限数量的参数

新方法: (…args)=>将Rest参数args视为数组 可以通过以下方式调用此函数:

foo("a","b","c","d");   //returns => 'abcd'

let params = ["a","b","c","d"];

foo(...params);   //returns => 'abcd' 
旧方法: 可以通过以下方式调用此函数:

var args = ["a","b","c","d"];

foo(args);   //returns => 'abcd' 
这两种方法之间的唯一区别在于调用函数的方式


使用这个新特性还有其他好处吗?

rest参数的主要使用案例,顾名思义,是数量不定的“剩余”参数

假设我们定义了一个ES5函数,
defer
,该函数设置对任何参数的函数调用超时:

function defer ( thisObject, callable ) {
   var args = Array.prototype.slice.call( arguments, 2 );
   setTimeout( function(){
      callable.apply( thisObject, args );
   }, 0 );
}
defer( window, alert, 'Merry...' )
使用rest参数,我们可以完全消除
参数
,而无需更改函数签名:

function defer ( thisObject, callable, ... parameters ) {
   setTimeout( () => callable.apply( thisObject, parameters ), 0 );
}
defer( window, alert, "X'mas!" )
无需更改调用代码,我们的代码更干净。 我们保留前两个参数,并自动将其余参数作为数组获取。 这种模式并不罕见;这就是一个例子

要点是去掉
参数
,而不强制调用方将所有内容放入数组中。 让函数只接受数组对您来说很容易,但函数可能有数百个调用,这些调用都需要手动将参数包装到数组中,这甚至可能没有意义

  • 您更喜欢
    延迟(窗口,警报,[“Foo”])
    还是
    延迟(窗口,警报,[“Bar”)

  • 延迟(窗口,查找,[])
    延迟(窗口,查找)

  • Array.of([foo,bar,bas])

  • 就像Bergi所问的,我们为什么不把所有的参数都放到一个大的参数中呢

  • 希望这能把事情弄清楚。
    不要忘记,特性不必像箭头函数或模板字符串那样改变,就可以很好地发挥作用。

    Rest参数允许您展开一个iterable对象,并将其部分传递给函数。并非所有的iTerable都是数组;其他对象包括字符串、贴图和集

    编写接受数组参数的函数时,只能向其传递数组:
    foo(arr)
    。但是如果调用者没有数组,只有一个iterable,那么他们必须“arrayify”它:
    foo([…iterable])
    foo(array.from(iterable))
    ,等等

    当函数具有rest参数时,调用方可以扩展任何iterable,例如字符串:
    foo(…'hello')==foo('h','e','l','l','o')
    。如果
    foo
    仅接受数组,则无法执行此操作

    现在您可能想知道,调用
    foo(…iterable)
    比调用
    foo([…iterable])
    容易多少?你说得对,这稍微容易一点,但不会太多。rest参数只提供了一种更简洁的语法,因此从技术上讲,我们可以重构所有函数,使其不被使用。然而,它会使我们的代码更难阅读,正如在这里的其他答案中提到的

    console.log(['value:',value])
    Math.min([69,42,420])
    setTimeout(函数,300,[]))
    
    通常使用多个参数是否有优势?为什么函数不总是只有一个参数——如果您需要更多参数,您可以在这里传递一个列表?这个引用来自哪里?它不在链接页面或该页面链接的pdf上。事实上,谷歌搜索它(或它的一部分)不会得到任何结果。在没有背景的情况下,我看到的只是我已经使用了很长时间的Javascript,我只是出于学术目的,我也使用对象作为复杂函数的参数,然而,自从他们添加了这个新的操作符之后,我只是觉得我可能遗漏了一些东西。不过我还是不明白投票被否决的原因。我希望你的意思是“我只是好奇”,而不是“出于学术目的”。任何人都可以在SO上注册并在没有任何参考或备份的情况下写出答案,所以你不能盲目地将回答者视为老师。不管目的是什么,关于报价来源的问题仍然有效,而且这本身并不是否决投票的坏理由。
    function defer ( thisObject, callable ) {
       var args = Array.prototype.slice.call( arguments, 2 );
       setTimeout( function(){
          callable.apply( thisObject, args );
       }, 0 );
    }
    defer( window, alert, 'Merry...' )
    
    function defer ( thisObject, callable, ... parameters ) {
       setTimeout( () => callable.apply( thisObject, parameters ), 0 );
    }
    defer( window, alert, "X'mas!" )