15

ES6 引入了一系列方便的“语法糖”。其中包括 JavaScript 函数的默认参数能力,以及其余参数。我发现每当尝试在休息参数上设置默认参数值时,我的控制台(或 devTools)都会抱怨(抛出错误)。我发现在其他地方很少提到这个特定问题,我想知道1.)是否可以这样做,以及2.)为什么不这样做(假设不可能)。

例如,我设计了一个微不足道的(但希望仍然是有目的的)示例。在函数的第一次迭代中,我构造了函数,使其可以工作(也就是说,没有给 rest 参数一个默认值)。

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

No, rest parameters cannot have a default initialiser. It is not allowed by the grammar because the initialiser would never be run - the parameter always gets assigned an array value (but possibly an empty one).

What you want to do could be achieved by either

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

or

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 回答
1

只是来添加一个更干净的默认系统:

const describePerson = (name, ...traits) => {
  traits = Object.assign(['x', 'y'], traits);

  return `Hi, ${name}, you are ${traits.join(', ')}`;
}

describePerson('z'); // you are z, y
describePerson('a', 'b', 'c'); // you are a, b, c
describePerson(); // you are x, y

这是有效的,因为数组是索引为键Object.assign的对象,并使用第二个对象的值覆盖第二个对象中存在的第一个对象的键。

如果第二个没有索引 1,那么它不会被覆盖,但如果它有索引 0,第一个数组的索引 0 将被第二个覆盖,这是您在默认时所期望的行为

请注意,扩展数组与扩展对象的操作不同,这就是为什么[....['x', 'y'], ...traits]不会覆盖索引的原因

于 2019-04-17T05:18:30.260 回答
0

有一个解决方案:

const describePerson = (name, ...[
  first = 'a nondescript individual',
  ...traits
]) => `Hi, ${name}! You are ${[first, ...traits].join(', ')}`;
于 2020-12-30T07:44:05.943 回答