是否可以在静止参数上设置默认参数值

时间:2017-03-07 14:15:57

标签: javascript ecmascript-6 default-value spread-syntax

ES6引入了一系列方便的“语法糖”。其中包括JavaScript函数的default parameter功能,以及rest parameters。每当试图在rest参数上设置默认参数值时,我发现我的控制台(或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 =

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:10)

不,休息参数不能有默认的初始化程序。语法不允许这样做,因为初始化器永远不会运行 - 参数总是被赋予一个数组值(但可能是空的)。

你想做什么可以通过

来实现
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(', ')}`

答案 1 :(得分:0)

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

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]不会覆盖索引的原因

答案 2 :(得分:0)

有一个解决方案:

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