15

ES6 では、便利な「シンタックス シュガー」が多数導入されています。その中には、JavaScript 関数のデフォルトのパラメーター機能と残りのパラメーターがあります。残りのパラメーターにデフォルトのパラメーター値を設定しようとすると、コンソール (または devTools) が不平を言う (つまり、エラーをスローする) ことがわかりました。この特定の問題への参照を他の場所で驚くほどほとんど見つけていませ

例として、私は些細な (ただし、意図的なものであることを願っています) 例を考え出しました。この関数の最初の反復では、機能するように関数を作成しました (つまり、残りのパラメーターに既定値を指定しません)。

const describePerson = (name, ...traits) => `Hi, ${name}! You are ${traits.join(', ')}`;

describePerson('John Doe', 'the prototypical placeholder person');
// => "Hi, John Doe! You are the prototypical placeholder person"

ただし、デフォルトでは次のようになります。

const describePerson = (name, ...traits = ['a nondescript individual']) => `Hi, ${name}! You are ${traits.join(', ')}`;

describePerson('John Doe');
// => Uncaught SyntaxError: Unexpected token =

どんな助けでも大歓迎です。

4

3 に答える 3

14

いいえ、残りのパラメーターにデフォルトの初期化子を指定することはできません。イニシャライザが実行されないため、文法では許可されていません。パラメータには常に配列値が割り当てられます(ただし、空の値である可能性があります)。

やりたいことは、次のいずれかで達成できます

function describePerson(name, ...traits) {
     if (traits.length == 0) traits[0] = 'a nondescript individual';
     return `Hi, ${name}! You are ${traits.join(', ')}`;
}

また

function describePerson(name, firstTrait = 'a nondescript individual', ...traits) {
     traits.unshift(firstTrait);
     return `Hi, ${name}! You are ${traits.join(', ')}`;
}

// the same thing with spread syntax:
const describePerson = (name, firstTrait = 'a nondescript individual', ...otherTraits) =>
    `Hi, ${name}! You are ${[firstTrait, ...otherTraits].join(', ')}`
于 2017-03-07T14:34:22.860 に答える