这个JS函数param语法(具有属性默认值的对象初始值设定项,类似于rest / spread params)是否具有名称和效果?

时间:2018-01-15 06:23:27

标签: javascript ecmascript-6 babeljs ecmascript-7

当我找到logging我以前从未见过的时候,我正在阅读syntax库源代码,当通过解释器进行评估时,它似乎没有任何效果:

const createLogger = (title,
                     {
                         debugFunction = createDebug(title),
                         logFunction = console.log
                     } = {}) => { /* ... */ }
  1. 这个语法叫什么?
  2. 这种语法有什么影响?
  3. 可以从函数体中引用对象吗?
  4. ts-node的输出尝试重新创建:

    > const testFn2 = (arg1, {dFn = console.debug, lFn = console.log} = {}) => { console.log(arguments) }
    undefined
    
    > testFn2(1)
    { '0': 1 }
    undefined
    
    > testFn2(1, 2)
    { '0': 1, '1': 2 }
    undefined
    
    > testFn2(1, {})
    { '0': 1, '1': {} }
    undefined
    

3 个答案:

答案 0 :(得分:1)

这是

的组合

一起

......所有这些都在ES2015中添加。

它创建一个常量createLogger,并将其值设置为名为createLogger的函数,该函数接受两个参数:标题(title)和一个对象。该对象解构debugFunctionlogFunction参数中,如果不存在,则默认为{}

以下是一个更简单的析构参数示例:

function foo({a, b}) {
// Note -----^----^
  console.log(a, ",", b);
}

const o = {a: 1, b: 2};
foo(o); // 1 , 2

请注意我们如何使用对象调用foo,但foo的代码使用两个参数,其值是 destructured 来自该对象的属性。

如果我们在没有参数的情况下调用foo,我们会收到错误,因为解构试图访问参数的属性,并且访问undefined上的属性失败:

function foo({a, b}) {
  console.log(a, ",", b);
}

foo(); // Fails

如果我们为参数添加默认值,它可以工作:

function foo({a, b} = {a: "default a"}) {
// ----------------^^^^^^^^^^^^^^^^^^^
  console.log(a, ",", b);
}

foo(); // default a , undefined (since there's no `b` in the default)

答案 1 :(得分:0)

它被称为参数解构与默认值相结合:



let default1 = 1;
let default2 = 2;

const func = ({a = default1, b = default2} = {}) => {
  console.log(a);
  console.log(b);
}

// Here since no value is specified, the default argument will be {a: 1, b: 2}
func();




答案 2 :(得分:0)

您正在查看object destructring assignment,在这种情况下,用于初始化局部变量并为其分配默认值,而无需在函数体中声明它们。这是避免编写额外代码的模式;如果你没有破坏语法,你基本上会写:

const createLogger = (name, params = {}) => {
    let debugFunction = params.debugFunction || createDebug(name);
    let logFunction = params.logFunction || console.log;

     // do stuff
}

此时它可能会产生更多的问题,而不是它所消除的少量代码。更清楚,而不是简洁,尤其是在大型项目上。您可以组合多个三元分配而不是编写if-else块,但这样做会很糟糕。另一方面,这种风格可能会更加普遍。