这显然是一个有效的解构赋值,尽管qux
取决于bar
:
const { foo, bar, qux = () => bar } = myObject;
这是如何工作的,因为文档(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)没有介绍像上面的例子这样的依赖赋值是如何工作的。
qux: () => 'qux'
表示声明const qux
,其值将从myObject
中提取为属性qux
。
但是,如果myObject
没有这样的属性,则声明const就像刚刚写了const qux = () => bar
一样。因此,qux
的默认值为箭头函数。
请注意,要使用默认值,qux
属性必须不存在或在myObject
中设置为未定义。如果myObject
中的qux
为null或任何其他值,则不使用默认值。
还需要注意的是,这将起作用:
const { foo, qux = () => bar, bar, x=qux() } = {};
但是这会抛出ReferenceError: Cannot access 'bar' before initialization
:
const { foo, qux = () => bar, x=qux(), bar } = {};
这是因为当您执行qux = () => bar
时,它还没有尝试访问未声明的变量。但是,调用qux()
确实试图访问bar
变量,因此顺序很重要。