å©ä½åæ°
åºçº¿
广æ³å¯ç¨
èª 2016å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
å©ä½åæ°è¯æ³å è®¸å½æ°å°ä»»ææ°éçåæ°ä½ä¸ºæ°ç»æ¥æ¶ï¼ä»èå¨ JavaScript ä¸å®ç°äºå¯å忰彿°ç表示æ¹å¼ã
å°è¯ä¸ä¸
function sum(...theArgs) {
let total = 0;
for (const arg of theArgs) {
total += arg;
}
return total;
}
console.log(sum(1, 2, 3));
// ææè¾åºï¼6
console.log(sum(1, 2, 3, 4));
// ææè¾åºï¼10
è¯æ³
function f(a, b, ...theArgs) {
// â¦
}
æä¸äºé¢å¤çè¯æ³éå¶ï¼
- ä¸ä¸ªå½æ°å®ä¹åªè½å å«ä¸ä¸ªå©ä½åæ°ã
- å©ä½åæ°å¿ é¡»æ¯å½æ°å®ä¹çæåä¸ä¸ªåæ°ã
- å©ä½åæ°ä¹åä¸å 许åºç°å°¾åéå·ã
- å©ä½åæ°ä¸è½æé»è®¤å¼ã
æè¿°
彿°å®ä¹çæåä¸ä¸ªåæ°å¯æ·»å åç¼ ...ï¼ä¸ä¸ª U+002E FULL STOP å符ï¼ï¼è¿å°å¯¼è´ææå©ä½ï¼ç¨æ·æä¾çï¼åæ°è¢«æ¾å
¥ä¸ä¸ª Array 对象ä¸ã
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
myFun("one", "two", "three", "four", "five", "six");
// æ§å¶å°è¾åºï¼
// a, one
// b, two
// manyMoreArgs, ["three", "four", "five", "six"]
å©ä½åæ°å¯ä»¥è¿è¡è§£æï¼è¿å è®¸ä½ å¿½ç¥æäºåæ°ä½ç½®ã
function ignoreFirst(...[, b, c]) {
return b + c;
}
ç¶èï¼ä»¥ä¸åæ³å°å¯¼è´è¯æ³é误ï¼
function wrong1(...one, ...wrong) {}
function wrong2(...wrong, arg2, arg3) {}
function wrong3(...wrong,) {}
function wrong4(...wrong = []) {}
å©ä½åæ°ä¸ä¼è®¡å
¥å½æ°ç length 屿§ã
å©ä½åæ°å arguments 对象çåºå«
å©ä½åæ°å arguments 对象ä¹é´çåºå«ä¸»è¦æå个ï¼
argumentså¯¹è±¡ä¸æ¯çæ£çæ°ç»ï¼èå©ä½åæ°æ¯Arrayå®ä¾ï¼ä¹å°±æ¯è¯´ä½ è½å¤å¨å®ä¸é¢ç´æ¥ä½¿ç¨ææçæ°ç»æ¹æ³ï¼æ¯å¦sort()ãmap()ãforEach()æpop()ãarguments对象è¿å å«é¢å¤çï¼å·²å¼ç¨çï¼callee屿§ã- å¨éä¸¥æ ¼æ¨¡å¼ä¸åæ°ç®åç彿°ä¸ï¼
arguments对象ä¼å°ç´¢å¼å¼ä¸åæ°å¼åæ¥ãå½å ·ååæ°è¢«éæ°èµå¼æ¶ï¼å©ä½åæ°æ°ç»ç弿°¸è¿ä¸ä¼æ´æ°ã - å©ä½åæ°å°ææé¢å¤åæ°æå
为å䏿°ç»ï¼ä½ä¸å
å«ä»»ä½å¨
...restParamä¹åå®ä¹çå ·ååæ°ãarguments对象åå 嫿æåæ°ï¼å æ¬...restParamæ°ç»ä¸çåæ°ï¼ï¼è¿äºåæ°è¢«æå 为类æ°ç»å¯¹è±¡ã
示ä¾
>使ç¨å©ä½åæ°
卿¤ç¤ºä¾ä¸ï¼ç¬¬ä¸ä¸ªåæ°æ å°ä¸º aï¼ç¬¬äºä¸ªæ å°ä¸º bï¼å æ¤è¿äºå½ååæ°å¯æå¸¸è§æ¹å¼ä½¿ç¨ã
ç¶èï¼ç¬¬ä¸ä¸ªåæ° manyMoreArgs å°æ¯ä¸ä¸ªæ°ç»ï¼å
¶ä¸å
å«ç¬¬ä¸ã第åã第äºã第å
â¦â¦ç´è³ç¬¬ n ä¸ªåæ°ââå
·ä½æ°éåå³äºç¨æ·æå®çåæ°ä¸ªæ°ã
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
myFun("one", "two", "three", "four", "five", "six");
// a, "one"
// b, "two"
// manyMoreArgs, ["three", "four", "five", "six"] <-- ä¸ä¸ªæ°ç»
å¦ä¸æç¤ºï¼å³ä½¿åªæä¸ä¸ªå¼ï¼æåä¸ä¸ªåæ°ä»ä¼è¢«æ¾å ¥æ°ç»ä¸ã
// 使ç¨ä¸è¿°ç¤ºä¾ä¸åæ ·ç彿°å®ä¹
myFun("one", "two", "three");
// a, "one"
// b, "two"
// manyMoreArgs, ["three"] <-- å
·æä¸ä¸ªå¼çæ°ç»
å¦ä¸æç¤ºï¼å³ä½¿æ²¡ææä¾ç¬¬ä¸ä¸ªåæ°ï¼manyMoreArgs ä»ç¶æ¯ä¸ä¸ªæ°ç»ï¼å°½ç®¡ä¸ºç©ºï¼ã
// 使ç¨ä¸è¿°ç¤ºä¾ä¸åæ ·ç彿°å®ä¹
myFun("one", "two");
// a, "one"
// b, "two"
// manyMoreArgs, [] <-- è¿æ¯ä¸ä¸ªæ°ç»
å¦ä¸æç¤ºï¼åªæä¾äºä¸ä¸ªåæ°ï¼æä»¥ b 为é»è®¤å¼ undeifnedï¼ä½æ¯ manyMoreArgs ä»ç¶æ¯ä¸ä¸ªç©ºæ°ç»ã
// 使ç¨ä¸è¿°ç¤ºä¾ä¸åæ ·ç彿°å®ä¹
myFun("one");
// a, "one"
// b, undefined
// manyMoreArgs, [] <-- è¿æ¯ä¸ä¸ªæ°ç»
argument é¿åº¦
ç±äº theArgs æ¯æ°ç»ï¼å
¶å
ç´ æ°éå¯éè¿ length 屿§è·åãè¥å½æ°çå¯ä¸åæ°ä¸ºå©ä½åæ°ï¼å restParams.length å°çäº arguments.lengthã
function fun1(...theArgs) {
console.log(theArgs.length);
}
fun1(); // 0
fun1(5); // 1
fun1(5, 6, 7); // 3
æ®éåæ°ä¸å©ä½åæ°ç»å使ç¨
å¨ä¸ä¸ä¸ªç¤ºä¾ä¸ï¼ä½¿ç¨å©ä½åæ°å°ç¬¬ä¸ä¸ªåæ°ä¹åçææåæ°æ¶éå°ä¸ä¸ªæ°ç»ä¸ãéåå°æ°ç»ä¸æ¶éå°çæ¯ä¸ªåæ°å¼ä¸ç¬¬ä¸ä¸ªåæ°ç¸ä¹ï¼å¹¶è¿å该æ°ç»ï¼
function multiply(multiplier, ...theArgs) {
return theArgs.map((element) => multiplier * element);
}
const arr = multiply(2, 15, 25, 42);
console.log(arr); // [30, 50, 84]
ä» arguments å°æ°ç»
Array æ¹æ³å¯ä»¥ç¨äºå©ä½åæ°ï¼ä½ä¸è½ç¨å¨ arguments 对象ä¸ï¼
function sortRestArgs(...theArgs) {
const sortedArgs = theArgs.sort();
return sortedArgs;
}
console.log(sortRestArgs(5, 3, 7, 1)); // 1, 3, 5, 7
function sortArguments() {
const sortedArgs = arguments.sort();
return sortedArgs; // æ°¸è¿ä¸ä¼è¿å
}
console.log(sortArguments(5, 3, 7, 1));
// æåº TypeErrorï¼arguments.sort is not a functionï¼
å©ä½åæ°çå¼å ¥æ¨å¨åå°å°ä¸ç»åæ°è½¬æ¢ä¸ºæ°ç»æ¶å¸¸ç¨çåä½ä»£ç ã
å¨å¼å
¥å©ä½åæ°ä¹åï¼å¿
é¡»å
å° arguments 转æ¢ä¸ºæ®éæ°ç»ï¼æè½å¯¹å
¶è°ç¨æ°ç»æ¹æ³ï¼
function fn(a, b) {
const normalArray = Array.prototype.slice.call(arguments);
// â æ â
const normalArray2 = [].slice.call(arguments);
// â æ â
const normalArrayFrom = Array.from(arguments);
const first = normalArray.shift(); // 没é®é¢ï¼è¿å第ä¸ä¸ªåæ°
const firstBad = arguments.shift(); // æ¥éï¼arguments 䏿¯æ®éæ°ç»
}
ç°å¨ï¼ä½ å¯ä»¥è½»æ¾å°ä½¿ç¨å©ä½åæ°è®¿é®æ®éæ°ç»ï¼
function fn(...args) {
const normalArray = args;
const first = normalArray.shift(); // 没é®é¢ï¼è¿å第ä¸ä¸ªåæ°
}
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-function-definitions> |