06-解构参数
6.3.2 解构参数
就像解构赋值(详情见第5章)一样,JavaScript中也有解构参数(毕竟参数跟定义变量很类似)。考虑把一个对象解构到不同的变量中:
function getSentence({ subject, verb, object }) {
return '${subject} ${verb} ${object}';
}
const o = {
subject: "I",
verb: "love",
object: "JavaScript",
};
getSentence(o); // "I love JavaScript"
在解构赋值中,参数属性名必须是字符串标识符,而且如果传入的对象不存在与参数属性名匹配的属性,该属性将会接受一个 undefined 值。
甚至可以解构一个数组:
function getSentence([ subject, verb, object ]) {
return '${subject} ${verb} ${object}';
}
const arr = [ "I", "love", "JavaScript" ];
getSentence(arr); // "I love JavaScript"
最后,可以使用展开操作符(...)来收集任何多出来的参数:
function addPrefix(prefix, ...words) {
// 稍后会用一种更好的方法来实现!
const prefixedWords = [];
for(let i=0; i<words.length; i++) {
prefixedWords[i] = prefix + words[i];
}
return prefixedWords;
}
addPrefix("con", "verse", "vex"); // ["converse", "convex"]
注意,如果在函数定义中使用展开操作符,它必须是最后一个参数。如果在它之后还有参数,JavaScript就无法分辨出哪些参数使用展开参数,哪些使用它之后的参数。
在ES5中,类似的功能可以被只存在函数体中的特殊变量所实现:参数。这个变量并不是严格意义上的数组,它是一个“类数组”的对象,经常需要特殊处理,或者转化成合理的数组。ES6中的展开数组解决了这个问题,所以相比参数变量(现在依然存在),更应该使用展开参数。
在ES5中,类似的功能可以被只存在函数体中的特殊变量所实现:参数。这个变量并不是严格意义上的数组,它是一个“类数组”的对象,经常需要特殊处理,或者转化成合理的数组。ES6中的展开数组解决了这个问题,所以相比参数变量(现在依然存在),更应该使用展开参数。