ES6对象解构具有默认值赋值

时间:2018-03-14 23:26:52

标签: javascript ecmascript-6

请考虑以下代码:

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

变量b的值为a。这在将其转换为es5时确实有效,但我不完全确定这是否是有效的es6语法。

我是否可以在结构化对象中进行这种默认值赋值?

2 个答案:

答案 0 :(得分:1)

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

在语法上有效,但在语义上无效,因为您正在尝试对字符串原语进行解构,该字符串原语被装入一个临时的String对象包装器中,并尝试同时获取ab属性,总是undefined,因为包装器对象是临时的,只是为了触发装箱本身的操作而创建。

因此,当你打电话时,你有undefined, undefined

使用默认值的解构操作可以在语义上有效 在你的情况下通过这样的电话:

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

<强> UPD:

但要注意提供默认值的顺序很重要,所以这不会 工作

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

因为解析在参数对象初始化之后发生并且从左到右进行评估,因此b尚未解构并且在我们解构a以试图引用它时a已知。#function未定义。

答案 1 :(得分:0)

  

我是否可以在结构化对象中进行这种默认值赋值?

是。解构表达式从左到右进行计算,您可以使用已在以后属性的默认初始化表达式中的属性初始化的变量。

请记住,它是荒谬的

const log = (o) => {
  var a = o.a;
  var b = o.b !== undefined ? o.b : a;
//                                  ^ a is usable here
  console.log(a,b);
};