ES6 object destructuring with a default value assignment

前端 未结 2 1764
青春惊慌失措
青春惊慌失措 2021-01-28 17:16

Consider the following code:

const log = ({a,b=a}) => console.log(a,b);
log({a:\'a\'})

The variable b is assigned the value

2条回答
  •  無奈伤痛
    2021-01-28 17:47

    const log = ({a,b=a}) => console.log(a,b);
    log('a')
    

    is syntactically valid but semantically invalid, since you are trying to destructure a string primitive, which gets boxed into a temporary String object wrapper, and tries to get both a and b properties, which are always undefined since the wrapper object is temporary and only created for the sake of the operation triggering the boxing itself.

    Thus you have undefined, undefined when you call it.

    The destructuring operation with defaults could be semantically valid in your case with a call like this:

    const log = ({a,b=a}) => console.log(a,b);
    log({a: 'a'}) // a,a
    

    UPD:

    But beware that order of supplying default value matters, so this won't work

    const log = ({a=b,b}) => console.log(a,b);
    log({a: 'a'}) // error
    

    because destructuring happens after argument object initialization and is evaluated from left to right, thus b is not yet destructured and known by the time we destructure a to try to reference it in case a is undefined.

提交回复
热议问题