以这种方式传递参数意味着什么?

时间:2018-01-17 03:54:45

标签: javascript express

我正在学习javascript,我看到了这段代码,我不明白:

exports.configure = ({
   expressapp = null,
   userdb = null,
   path = '/myroute'
} = {}) => { 
   // handle routes
};

我对传入的参数的结构以及内部发生的事情最为困惑。我在哪里可以找到更多相关信息,以便我可以阅读它?当你传递这样的论点时甚至会调用什么?你为什么要这样做?

3 个答案:

答案 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'
}