在Javascript函数中使用新的ES2015 rest参数而不是使用数组参数有什么好处?
首先介绍一些背景: 在ES2015中,引入了许多新的javascript特性 其中包括rest参数,使函数能够接受 不确定的参数数量,同时避免一些不良做法 就像使用函数的arguments属性一样 在这些示例中,我们有两个js函数执行完全相同的操作: 接受无限数量的参数 新方法: (…args)=>将Rest参数args视为数组 可以通过以下方式调用此函数:在Javascript函数中使用新的ES2015 rest参数而不是使用数组参数有什么好处?,javascript,ecmascript-6,Javascript,Ecmascript 6,首先介绍一些背景: 在ES2015中,引入了许多新的javascript特性 其中包括rest参数,使函数能够接受 不确定的参数数量,同时避免一些不良做法 就像使用函数的arguments属性一样 在这些示例中,我们有两个js函数执行完全相同的操作: 接受无限数量的参数 新方法: (…args)=>将Rest参数args视为数组 可以通过以下方式调用此函数: foo("a","b","c","d"); //re
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])
不要忘记,特性不必像箭头函数或模板字符串那样改变,就可以很好地发挥作用。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!" )