《ES6标准入门(第3版)》学习笔记20:chapter_7 函数的扩展之rest参数和严格模式

这是该系列的第20篇笔记!
1,rest参数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>rest参数</title>
</head>
<body>
    
    <script>
    // ES6引入了"rest参数"(形式为“...变量名”),用于获取函数的多余参数,这样就可以不使用arguments对象了
    // rest参数搭配的变量是一个数组,该变量将多余的参数放入其中

    function add(...values){  // 利用rest参数可以向该函数传入任意数数目的参数
        let sum = 0;
        for (var val of values){
            sum += val;

        }
        return sum;
    }
    
    console.log(add(2, 3, 5));

    console.log([2, 3, 23]);
    console.log('1' + '2' + '3');  // '123'
    for (var i in [2, 3, 23]){
        console.log(i);
    }
    
    // 一个rest参数代替arguments变量的例子
    // arguments变量的写法
    // function sortNumbers(){
    //     return Array.prototype.slice.call(arguments).sort();
    // }


    // rest参数的写法
    const sortNumbers = (...numbers) => numbers.sort();
    
    // rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量

    
    // 【注意】
    // 1, rest参数之后不能有其他参数(即只能是最后一个参数),否则会报错
    // function f(a, ...b, c){
    //     // .....

    // }

    // 2, 函数的length属性不包括rest参数
    console.log((function (a){}).length); // 1
    console.log((function (...a){}).length);  // 0

    
    </script>
</body>
</html>

2,严格模式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>严格模式</title>
</head>
<body>
    
    <script>
    // ES5开始,函数内部可以设定为严格模式
    // function doSomething(a, b){
    //     'use strict';
    //     // code

    // }
    
    // ES 6规定:只要函数参数使用了默认值、解构赋值或者扩展运算符,那么函数内部就不能显式设定为严格模式,否则就会报错

    // 以下写法均报错!!!

    // function doSomething(a, b = a){
    //     'use strict';
    //     // code
    // }
    
    // const doSomething = function({a, b}){
    //     'use strict';
    //     // code
    // }
    
    // const doSomething = (...a) => {
    //     'use strict';
    //     // code
    // }
    
    // const obj = {
    //     doSomething({a, b}){
    //         'use strict';
    //         // code
    //     }
    // }

    // 【总结】ES6如此规定的原因是:函数内部的严格模式同时适用于函数体和函数参数
    //        但是,函数执行时,先执行函数参数,然后在执行函数体,有个不合理的地方:只有从函数体之中才能知道参数是否应该以严格模式执行,但是参数却应该先于函数体执行

    // 报错
    // function doSomething(value = 070){
    //     'use strict';
    //     return value;
    // }
    // 实际上,如上代码,JavaScript引擎会先成功执行value=070(虽然严格模式规定不能用前缀0表示八进制),然后在进入函数体内部,发现需要用严格模式执行时才会报错

    // 有2种方法可以规避关于“不能显式指定严格模式”的限制:
    // way 1: 设定为全局性的严格模式
    // 'use strict';
    // function doSomething(a, b = a){

    // }

    // way 2: 把函数包在一个无参数的立即执行的函数里边
    const doSomething = (function(){
        'use strict';
        return function(value = 42){
            return value;
        };
    }());
    
    
    
    </script>
</body>
</html>

让学习“上瘾”,成为更好的自己!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值