这是该系列的第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>
让学习“上瘾”,成为更好的自己!!!