我正在学习javascript,我看到了这段代码,我不明白:
exports.configure = ({
expressapp = null,
userdb = null,
path = '/myroute'
} = {}) => {
// handle routes
};
我对传入的参数的结构以及内部发生的事情最为困惑。我在哪里可以找到更多相关信息,以便我可以阅读它?当你传递这样的论点时甚至会调用什么?你为什么要这样做?
答案 0 :(得分:4)
模式是一个解构赋值,它将普通对象指定为默认参数,以避免在没有值传递给函数时TypeError
。
const exports = {};
exports.configure = ({
expressapp = null,
userdb = null,
path = '/myroute'
}) => {
// handle routes
console.log(expressapp)
};
try {
exports.configure();
} catch(err) {
console.error(err)
}
const exports = {};
exports.configure = ({
expressapp = null,
userdb = null,
path = '/myroute'
} = {}) => {
// handle routes
console.log(expressapp)
};
try {
exports.configure();
} catch(err) {
console.error(err)
}
答案 1 :(得分:2)
您应该阅读此页面以获取更多信息: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
基本上如果我们分配
var [a,b] = [2,3];
我们得到a = 2和b = 3是有道理的。把它想象成一面镜子。
如果我们分配
var {a: x, b: y} = {a: 3, b: 4}
有意义的是x = 3且y = 4 (因为{a:x,b:y}上的'a'位置被x占据,而{a:3,b:4}上的'a'位置被3占用,因此分配逻辑意义3到x。)
A)这可以扩展到功能参数,我们可以
function myFunc({a:x, b:y}){//do stuff}
并调用myFunc({a:3,b:4})意味着x = 3,y = 4
B)我们现在问自己为什么需要引入x和y。相反,我们可以
function myFunc({a:a, b:b}){//do stuff}
并且调用myFunc({a:3,b:4})意味着a = 3,b = 4
C)如果我们缺少信息怎么办?然后我们可以做
function myFunc({a:a = 1, b:b = 2}){// do stuff}
现在调用myFunc({b:4})意味着a = 1,b = 4
调用myFunc({})意味着a = 1,b = 2.
因为你可以认为{}为{a:undefined,b:undefined}
D)如果缺少整个参数(整个对象)怎么办?这完全是一个完全不同的东西,会导致错误。要回答这个问题,可以做一个更简单的例子。
function simple(a=3){//do stuff};
调用simple()会触发默认参数,意味着a = 3
回到我们更复杂的功能,我们可以写
function myFunc({a:a = 1, b:b = 2} = {}){// do stuff}
同样,调用myFunc()会触发默认参数,暗示
{a:a = 1, b:b = 2} = {}
您可以将其视为
{a:a = 1, b:b = 2} = {a: undefined, b: undefined}
使'a'未定义,'b'未定义,触发默认参数,这意味着a = 1,b = 2
E)现在我们介绍一个简写的地方
var {a:a} = {a:3}
与
相同var {a} = {a: 3}
回到我们的功能,我们可以看到
function myFunc({a:a = 1, b:b = 2} = {}){// do stuff}
相当于
function myFunc({a = 1, b = 2} = {}){// do stuff}
这不会添加任何功能,只需清理
答案 2 :(得分:1)
这与写作
相同
exports.configure = (argument = {}) => {
// handle routes
};
其中参数是
{
expressapp = null,
userdb = null,
path = '/myroute'
}