• ECMAScript 6 语法 2 —— 三个点...的作用,何为Rest?


            很多人把 这三个点叫做 Rest 参数 ,我百思不得其解,对照了各种翻译之后,恍然大悟,应该翻译为剩余,剩下的,再引申为"等等...,剩下的这些省略的数据" 最为恰当。... 它出现的场景,这每个点都代表了,一个同维度,各自平等的一组连续的数据,仅此而已。

            虽是一家之言,但也算自圆其说。愿各位有所收获,便是极好的。

    何为Rest

             ...  等等等 三个点 ... :  使用场景一:处理 ... rest 形参问题。

    看一个例子:

    1. function calculate(operator){
    2. if(operator === "+"){
    3. let result = 0; // 业务逻辑:加法基础数 0
    4. for(let i = 1;i<arguments.length;i++){
    5. // result = result + arguments[i];
    6. result += arguments[i];
    7. }
    8. return result;
    9. }
    10. else if(operator === "*"){
    11. let result = 1; // 业务逻辑:乘法基础数 1
    12. for(let i = 1;i<arguments.length;i++){
    13. // result = result + arguments[i];
    14. result *= arguments[i];
    15. }
    16. return result;
    17. }
    18. }
    19. let calculateResult = calculate("*",1,2,3,4,5,6);
    20. console.log(calculateResult);

            无论function中定义了多少形参,我们在函数中都可以用这arguments 来接收,这个arguments属于函数的系统变量,无须你自己声明处理逻辑。

    吐槽1:由于前头的第一个形参被我们自己声明占用了,不得已我们剩下的那些参数 即调用者传入的参数的arguments索引只能从1开始,这个坑要程序员根据自己实际情况,来编码指定开始索引,费脑子易掉头发。

    吐槽2:调用者从形参上看不出来,这个函数是可以接受任意参数的参数的。一个脑筋没转过来,可能就不知道怎么用了。

    针对以上问题,ES6 引入了 ... 三个点点——等等剩余参数,官方叫它Rest参数。

    1. function calculate(operator,...restUserData){
    2. if(operator === "+"){
    3. let result = 0; // 业务逻辑:加法基础数 0
    4. for(let i = 0 ;ilength;i++){
    5. result+=restUserData[i];
    6. }
    7. return result;
    8. }
    9. else if(operator === "*"){
    10. let result = 1; // 业务逻辑:乘法基础数 1
    11. for (let elementDatum of restUserData) {
    12. result *= elementDatum
    13. }
    14. return result;
    15. }
    16. }
    17. let calculateResult2 = calculate("*",1,2,3,4,5,6);
    18. console.log(calculateResult2);

             累加累乘的数据,就是遍历剩下用户传入的那些rest等等的参数,这时候就无须考虑索引问题了。所以我第二个for循环,索性就写了一个和索引无关的 for-of 循环。

             ...  等等等 三个点 ... :  使用场景二:压扁一个引用类型的数据的场景。

            说到引用类型的数据,做为一个程序员,应该第一时间在脑子中浮现应该就是数组和对象了吧。

            很多地方都叫它展开运算符,我不得不吐槽,翻译本身也成为了我们学习者不可逾越的障碍,如果一个翻译不好,就会有数以亿计的人,一代一代的人,不停的在一个知识点里,来回的掉坑。其实我看来,叫它Rest依然合适,等等这些省略了的数据,这层意思,依然适合对引用类型的数据,数组和对象。

    1. let a = [1,2,3];
    2. console.log(calculate('*',...a)) ; // 等价于 calculate('*',1,2,3)

            这里的等... 就有一个数据 press flat data,碾平展开 的效果。同样适用于对象:

    1. let father = {
    2. species:'人类',
    3. planet:'地球',
    4. language:'汉语'
    5. }
    6. let son = {
    7. ...father,name:'张三'
    8. }

            意思就是说:...father 身上  “等等... 这些剩下的,省略的” 优秀的属性,也集中到son这个对象身上来了。这样翻译rest是不是毫无违和感。此处要特别注意的是:...出现在定义对象的时候,无须在意rest变量 编码前后顺序,但是出现在方法形参的时候一定要是最后一个,这个仅就是一个语言规范,没什么要解释的。

            自圆其说的一家之言,愿各位有所收获。

  • 相关阅读:
    K8S之使用Deployment实现滚动更新
    Oracle LiveLabs实验:Automatic Partitioning in Autonomous Database
    MySQL —— 索引
    vue 打包配置
    点云从入门到精通技术详解100篇-基于点云数据的机器人动态分拣
    Nginx系列之支持SSL认证
    控制语句之break、continue、return的用法(练习题)
    c++函数模板,类模板以使用
    【Linux 网络】高级 IO -- 详解
    QT 信号与槽
  • 原文地址:https://blog.csdn.net/wdw18668109050/article/details/127782263