æ®ä½å¼æ°
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã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) {
// â¦
}
ããã¤ãã®è¿½å ã®æ§æä¸ã®å¶éãããã¾ãã
- 颿°å®ç¾©ã¯ãæ®ä½å¼æ°ã 1 ã¤ããæã¤ãã¨ãã§ãã¾ããã
- æ®ä½å¼æ°ã¯é¢æ°å®ç¾©ã«ããã¦æå¾ã®å¼æ°ã§ãããªããã°ãªãã¾ããã
- æ®ä½å¼æ°ã®å¾ã«æ«å°¾ã«ã³ãã¯è¨±å¯ããã¾ããã
- æ®ä½å¼æ°ã¯æ¢å®å¤ãæã¤ãã¨ãã§ãã¾ããã
解説
颿°å®ç¾©ã®æå¾ã®å¼æ°ã« ... ï¼3 ã¤ã® U+002E FULL STOP æåï¼ã®æ¥é è¾ãä»ããã¨ãï¼ã¦ã¼ã¶ã¼ãæä¾ããï¼ãã®ä½ç½®ã«ããæ®ãã®å¼æ°ãæ¨æºã® JavaScript ã®é
åã®ä¸ã«å
¥ãããã¨ãã§ãã¾ãã
æå¾ã®å¼æ°ã®ã¿ããæ®ä½å¼æ°ãã«ãªããã¨ãã§ãã¾ãã
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 ãªãã¸ã§ã¯ãã®éã«ã¯ã主㫠4 ã¤ã®éããããã¾ãã
argumentsãªãã¸ã§ã¯ãã¯å®éã¯é åã§ã¯ããã¾ããã䏿¹ãæ®ä½å¼æ°ã¯Arrayã¤ã³ã¹ã¿ã³ã¹ã§ããã¤ã¾ããsort()ãmap()ãforEach()ãpop()ãªã©ã®ã¡ã½ãããç´æ¥é©ç¨ã§ãã¾ããargumentsãªãã¸ã§ã¯ãã«ã¯ã鿍奍ã®calleeããããã£ãªã©ã追å ã®ããããã£ãããã¾ãã- åç´ãªå¼æ°ãæã¤å³æ ¼ã§ãªã颿°ã§ã¯ã
argumentsãªãã¸ã§ã¯ãã¯å¼æ°ã®å¤ã¨ã¤ã³ããã¯ã¹ãåæãã¾ããååä»ã弿°ãåå²ãå½ã¦ããã¦ããæ®ä½å¼æ°é åã®å¤ã¯æ´æ°ããã¾ããã - æ®ä½å¼æ°ã¯ãã¹ã¦ã®è¿½å 弿°ãä¸ã¤ã®é
åã«æãããã®ã§ã
...restParamã®åã«å®ç¾©ãããååä»ã弿°ã¯å«ã¾ãã¾ããã䏿¹ãargumentsãªãã¸ã§ã¯ãã¯ã...restParamé åã®å¼æ°ãå«ããã¹ã¦ã®å¼æ°ãã 1 ã¤ã®é å風ãªãã¸ã§ã¯ãã«æãããã®ãå«ãã§ãã¾ãã
ä¾
>æ®ä½å¼æ°ã®ä½¿ç¨
ãã®ä¾ã§ã¯ãæåã®å¼æ°ã a ã«ã 2 çªç®ã®å¼æ°ã b ã«å²ãå½ã¦ããã¾ãã®ã§ããããã®ååä»ã弿°ã¯ãµã¤ãéã使ããã¾ãã
ãããã 3 çªç®ã®å¼æ°ãmanyMoreArgs ã¯ã 3 çªç®ã 4 çªç®ã 5 çªç®ã 6 çªç®ãï½ 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"] <-- é
åã§ãããã¨ã«æ³¨æ
以ä¸ãå¤ã 1 ã¤ãããªãã¦ããæå¾ã®å¼æ°ã¯é åã«å ¥ãããã¾ãã
// ä¸è¨ã®ä¾ã¨åã颿°å®ç¾©ã使ç¨
myFun("one", "two", "three");
// a, "one"
// b, "two"
// manyMoreArgs, ["three"] <-- å¤ã 1 ã¤ã ãã§ãé
åã§ãããã¨ã«æ³¨æ
以ä¸ã®ä¾ã§ã¯ã 3 çªç®ã®å¼æ°ãæä¾ããã¦ãã¾ãããã manyMoreArgs ã¯é
åã®ã¾ã¾ã§ãï¼ãã ã空ã®ãã®ã§ãï¼ã
// ä¸è¨ã®ä¾ã¨åã颿°å®ç¾©ã使ç¨
myFun("one", "two");
// a, "one"
// b, "two"
// manyMoreArgs, [] <-- ãã¯ããããé
å
ä¸è¨ã§ã¯ã弿°ã 1 ã¤ããæä¾ããã¦ããªãããã b ã¯æ¢å®å¤ã® undefined ã¨ãªãã¾ããã manyMoreArgs 空ã®é
åã®ã¾ã¾ã«ãªãã¾ãã
// ä¸è¨ã®ä¾ã¨åã颿°å®ç¾©ã使ç¨
myFun("one");
// a, "one"
// b, undefined
// manyMoreArgs, [] <-- still an array
弿°ã®é·ã
theArgs ã¯é
åãªã®ã§ã length ããããã£ã使ç¨ãã¦è¦ç´ æ°ãåå¾ãããã¨ãã§ãã¾ãã颿°ã®å¯ä¸ã®å¼æ°ãæ®ä½å¼æ°ã§ããå ´åãrestParams.length 㯠arguments.length ã¨çãããªãã¾ãã
function fun1(...theArgs) {
console.log(theArgs.length);
}
fun1(); // 0
fun1(5); // 1
fun1(5, 6, 7); // 3
é常ã®å¼æ°ã¨æ®ä½å¼æ°
次ã®ä¾ã§ã¯ãæ®ä½å¼æ°ã使ç¨ã㦠2 çªç®ã®å¼æ°ããæå¾ã®å¼æ°ã¾ã§ãé åã«éãã¦ãã¾ãããããããããããæåã®å¼æ°ã¨ä¹ç®ãããã®é åãè¿ãã¾ãã
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 ã¯é¢æ°ã§ã¯ãªãï¼
æ®ä½å¼æ°ã¯ã弿°ã®éåãé åã«å¤æããããã«ä¸è¬çã«ä½¿ç¨ãããã¨ãã§ããå®åã³ã¼ãã忏ããããã«å°å ¥ããã¾ããã
æ®ä½å¼æ°ã®ç»å ´ä»¥åã arguments ã¯é
åã¡ã½ãããå¼ã³åºãåã«é常ã®é
åã«å¤æããå¿
è¦ãããã¾ãã
function fn(a, b) {
const normalArray = Array.prototype.slice.call(arguments);
// â or â
const normalArray2 = [].slice.call(arguments);
// â or â
const normalArrayFrom = Array.from(arguments);
const first = normalArray.shift(); // OK, gives the first argument
const firstBad = arguments.shift(); // ERROR (arguments is not a normal array)
}
æ®ä½å¼æ°ã使ç¨ãã¦ãé常ã®é åã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ããã
function fn(...args) {
const normalArray = args;
const first = normalArray.shift(); // OK, gives the first argument
}
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-function-definitions > |