先上题目👇
const createMember = ({ email, address = {} }) => {
const validEmail = /.+\@.+\..+/.test(email)
if (!validEmail) throw new Error("Valid email pls")
return {
email,
address: address ? address : null
}
}
const member = createMember({ email: "my@email.com" })
console.log(member) //{ email: "my@email.com", address: {} } C
A:{ email: "my@email.com", address: null }
B:{ email: "my@email.com" }
C:{ email: "my@email.com", address: {} }
D:{ email: "my@email.com", address: undefined }
这道题的正确答案是选C,可能大部分的第一反应是选A,也就是说传入的对象参数直接覆盖了形参,他们两个的引用指向两个地方。
但这道题考察的其实是函数参数的结构赋值
传参的过程可以类比成 { email, address = {} }={ email: “my@email.com” }
我们不难看出,这就是对象的解构赋值。
下面贴出MDN上关于这一部分的内容👇
上面两张图,第一张图解释了为啥address={},第二张图则解释了这里为啥不是对象的覆盖。这种写法在实际开发中很少出现,但却很考验面试人的js基础。