Page 95 - 你不知道的JavaScript(下卷)
P. 95

function foo(...args) {
                       console.log( args );
                   }

                   foo( 1, 2, 3, 4, 5);          // [1,2,3,4,5]


                          foo(..) 函数声明中的 ...args 通常称为“rest 参数”,因为这里是在收集其
                          余的参数。我喜欢用“收集”这个词,因为这更好地描述了它的行为而不是
                          它的内容。


               这种用法最好的一点是,它为弃用很久的 arguments 数组——实际上它并不是真正的数
               组,而是类似数组的对象——提供了一个非常可靠的替代形式。因为 args(或者随便你
               给它起什么名字——很多人喜欢用 r 或 rest)是一个真正的数组,前 ES6 中有很多技巧
               用来把 arguments 转变为某种我们可以当作数组来使用的东西,现在我们可以摆脱这些愚
               蠢的技巧了。

               考虑:

                   // 按照新的ES6的行为方式实现
                   function foo(...args) {
                       // args已经是一个真正的数组

                       // 丢弃args中第一个元素
                       args.shift();

                       // 把整个args作为参数传给console.log(..)
                       console.log( ...args );
                    }

                   // 按照前ES6的老派行为方式实现
                   function bar() {
                       // 把arguments转换为一个真正的数组
                       var args = Array.prototype.slice.call( arguments );

                       // 在尾端添加几个元素
                       args.push( 4, 5 );

                       // 过滤掉奇数
                       args = args.filter( function(v){
                           return v % 2 == 0;
                       } );

                       // 把整个args作为参数传给foo(..)
                       foo.apply( null, args );
                   }

                   bar( 0, 1, 2, 3 );                  // 2 4

               函数 foo(..) 声明中的 ...args 收集参数,console.log(..) 调用中的 ...args 将其展开。



               72   |   第 2 章
                                图灵社区会员 avilang(1985945885@qq.com) 专享 尊重版权
   90   91   92   93   94   95   96   97   98   99   100