一道关于解构赋值和参数默认值的编程题
在前端俱乐部QQ群中,有朋友发出这样的题目,说最近面试中遇到了,如下所示
function fun( ? ) {
return {a,b}
}
console.log(fun( )) // {a:1,b:2}
console.log(fun({a:3})) // {a:3,b:456}
console.log(fun({})) // {a:123,b:456}
问,fun 的参数应该填什么?
提示:利用结构赋值和参数默认值
经过我一番测试,其结果如下所示:
function fun({ a = 123, b = 456 } = { a: 1, b: 2 }) {
return { a, b };
}
解题思路
先看第一个执行: console.log(fun( )) // {a:1,b:2}
fun()
不传参数,直接执行,结果 a 为 1,b 为 2。说明默认值为 a : 1,b : 2。
可以得出
function fun(a = 1, b = 2) {
return { a, b };
}
再看第二个执行:console.log(fun({a:3})) // {a:3,b:456}
fun({a: 3})
,参数传入一个对象,对象中 a 为 3,其结果 a 为 3,b 为 456。说明其参数默认值为一个对象,对象中的值又有默认参数 a 与 b。
结合“执行 1”,如果不传参数,默认用 a = 1, b = 2
的选项;如果传入参数;则用对象中的默认参数。即
function fun({ a = XX, b = 456 } = { a: 1, b: 2 }) {
return { a, b };
}
最后看第三个执行:console.log(fun({})) // {a:123,b:456}
很明显,我们还不知道对象中的默认 a 代表什么。第三个执行告诉我们它为 123
所以最后我们的答案是
function fun({ a = 123, b = 456 } = { a: 1, b: 2 }) {
return { a, b };
}
难点
在做这道题的时候,我被赋值的 =
和 :
迷惑了。这里做笔记记录
-
:
针对对象赋值 -
=
为默认值
如图所示:
const obj = {
a: 1,
b: 2,
c: 3,
d: 4,
};
const { a, b } = obj; // 解构赋值 a,b, a为1,b为2
const { a = 11, b = 21, e = 51 } = obj; // 给解构赋值的 设置默认值,a为1,b为2,e为51,得默认值是当你对象中没有值时,赋予该变量的默认值
=
赋予变量默认值
那么 :
何处使用,当解构赋值中的值为一个对象的时,设置对象中的值就用:
const obj = {
a: {
aa: 11,
bb: 22,
},
b: 2,
c: 3,
d: 4,
};
const { a, b } = obj; // a={aa: 11, bb: 22} b=2
const { a = { aa: 111, bb: 222 }, b = 22, e = { aa: 111, bb: 222 } } = obj;
// a={aa: 11, bb: 22},b = 22, e={aa: 111, bb: 222}
这里我们要注意:当解构的值在对象中,即使设置默认值,还是会以值为准;如果解构的值不在对象中,则会以默认值的形式出现在结果值中。
回头看题
function fun( ? ) {
return {a,b}
}
console.log(fun( )) // {a:1,b:2}
console.log(fun({a:3})) // {a:3,b:456}
console.log(fun({})) // {a:123,b:456}
为什么 a = 123, b = 456 要用等于号=
,而不是用冒号:
呢,因为它原本是”键“,只能赋予默认值而不能将键重命名
总结
解构赋值时,冒号:
是重命名,等于号=
是赋值默认值