本文深入解析ES6中函数的四大扩展特性。涵盖参数默认值的定义与length属性变化、Rest参数获取多余参数、扩展运算符转换数组,以及箭头函数的语法、this指向限制和构造函数限制。同时介绍ES2017引入的函数参数尾逗号规范,帮助开发者掌握现代JavaScript函数编程的最佳实践。
本文详细介绍ES6中函数特性的扩展内容,供读者参考学习。
函数参数默认值
一、函数参数默认值
ES6标准允许为函数参数设置默认值,直接在参数定义后指定即可。
function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello
这种写法具有两个主要优势:首先,代码阅读者能直观识别哪些参数可选,无需查阅函数体或文档;其次,有利于后续代码优化,即使未来版本移除该参数,旧代码仍能正常运行。
参数变量默认以var形式声明,因此不能使用let或const再次声明,否则将引发错误。
默认值参数可与解构赋值的默认值结合使用。
function foo({x, y = 5}) {
console.log(x, y);
}
foo({}) // undefined, 5
foo({x: 1}) // 1, 5
foo({x: 1, y: 2}) // 1, 2
foo() // TypeError: Cannot read property 'x' of undefined
通常建议将带有默认值的参数置于函数尾部,以便清晰判断省略了哪些参数。若非尾部参数设置默认值,则该参数无法被省略。
当指定默认值后,函数的length属性将返回未指定默认值的参数个数,这意味着length属性在存在默认值时会失真。
(function (a) {}).length // 1
(function (a = 5) {}).length // 0
(function (a, b, c = 5) {}).length // 2
Rest参数
二、Rest参数
ES6引入Rest参数(格式为“...变量名”),用于获取函数多余参数,从而替代arguments对象。Rest参数对应的变量是一个数组,所有多余参数将被存入该数组。
function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
上述add函数为求和函数,利用Rest参数可向该函数传入任意数量的参数。
需注意,Rest参数后不能再定义其他参数(即必须为最后一个参数),否则将报错。
函数的length属性不包含Rest参数。
扩展运算符
三、扩展运算符
扩展运算符(spread)由三个点(...)表示,相当于Rest参数的逆运算,可将数组转换为用逗号分隔的参数序列。
console.log(...[1, 2, 3])
// 1 2 3
console.log(1, ...[2, 3, 4], 5)
// 1 2 3 4 5
[...document.querySelectorAll('div')]
// [<div>, <div>, <div>]
箭头函数
四、箭头函数
ES6允许使用“箭头”(=>)定义函数。箭头函数左侧为输入,右侧为输出,即inputs => outputs。
var f = v => v;
//上面的箭头函数等同于:
var f = function(v) {
return v;
};
若箭头函数无需参数或需多个参数,需使用圆括号包裹参数部分。
var f = () => 5;
// 等同于
var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};
若箭头函数的代码块包含多条语句,需使用大括号包裹,并显式使用return语句返回结果。
var sum = (num1, num2) => { return num1 + num2; }
//由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号。
var getTempItem = id => ({ id: id, name: "Temp" });
箭头函数可与变量解构结合使用。
const full = ({ first, last }) => first + ' ' + last;
// 等同于
function full(person) {
return person.first + ' ' + person.last;
}
箭头函数的一个常见用途是简化回调函数。
// 正常函数写法
[1,2,3].map(function (x) {
return x * x;
});
// 箭头函数写法
[1,2,3].map(x => x * x);
以下是Rest参数与箭头函数结合使用的示例。
const numbers = (...nums) => nums;
numbers(1, 2, 3, 4, 5)
// [1,2,3,4,5]
箭头函数有以下几个使用注意事项。
(1)函数体内的this对象指向定义时所在的对象,而非使用时所在的对象。 (2)不可作为构造函数使用,即不能使用new命令,否则将抛出错误。 (3)函数体内不存在arguments对象。如需使用,可改用Rest参数。 (4)不可使用yield命令,因此箭头函数不能用作Generator函数。
上述四点中,第一点尤为关键。this对象的指向通常可变,但在箭头函数中它是固定的。
函数参数的尾逗号
五、函数参数的尾逗号
ECMAScript 2017标准允许函数最后一个参数后存在尾逗号(trailing comma)。
在此标准之前,函数定义和调用时均不允许最后一个参数后出现逗号。
function clownsEverywhere(
param1,
param2
) { /* ... */ }
上述代码中,若在param2或bar后添加逗号,将会导致报错。
若后续修改代码,需为函数clownsEverywhere添加第三个参数,则必须在第二个参数后添加逗号。这在版本管理系统中会显示该行发生变动,显得冗余。因此,新语法允许定义和调用时尾部直接包含逗号。
function clownsEverywhere(
param1,
param2,
) { /* ... */ }
希望本文所述内容对大家掌握ECMAScript程序设计有所帮助。