我完全理解ECMAScript 6已经创建了许多使用箭头函数等函数处理的潜在方法。
由于我在讨论函数的默认参数时不熟悉新内容。如何解释以下定义函数的方式之间的差异:
功能1:
function m1({x = 0, y = 0} = {}) {
return [x, y];
}
功能2:
function m2({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
答案 0 :(得分:4)
当您尝试将某些内容传递给您的函数时,区别很明显:
m1({}) // [0, 0]
m1({z: 1}) // [0, 0]
m1({x: 1}) // [1, 0]
m2({}) // [undefined, undefined]
m2({z: 1}) // [undefined, undefined]
m2({x: 1}) // [1, undefined]
你的第一个语法(m1({x = 0, y = 0} = {})
)做了三件事:
m1()
),则使用默认的空对象(即它变为m1({})
)x
和y
属性。undefined
,则会为其指定默认值0
。 m2({x, y} = { x: 0, y: 0 })
做了一些截然不同的事情:
{x: 0, y: 0}
。如果没有传递第一个参数,则使用该对象。如果传递除undefined
以外的任何参数,则使用该值。x
和y
属性。如果它们是undefined
,那就是您将获得的。第一个选项(具有默认值的参数,使用更多默认值进行解构)几乎可以肯定你想要的。第二个选项意味着如果传递参数,则代码对属性没有合理/有用的默认值。
答案 1 :(得分:0)
m1
提供x
和y
的默认值,而m2
仅从提供的对象中解构x
和y
,并且仅提供如果未提供对象本身,则为默认值:
m1({})
将返回[0, 0]
m2({})
将返回[undefined, undefined]
m1()
和m2()
都会返回[0, 0]
m1({x: 10})
将返回[10, 0]
m2({x: 10})
将返回[10, undefined]
因此,如果m2
收到一个对象,它会将可用值解构为变量x
和y
。如果缺少任何一个,那就是undefined
。只有当整个对象丢失时,它才会提供一个默认对象({ x: 0, y: 0 }
),从中获取值。
m1
会为两个属性提供默认值,即使它们已丢失。如果整个对象丢失,它仍将提供这些默认值。