js函数里面的参数可以这样写?怎么理解呢?

function createConnect({
  connectHOC = connectAdvanced,
  mapStateToPropsFactories = defaultMapStateToPropsFactories,
  mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,
  mergePropsFactories = defaultMergePropsFactories,
  selectorFactory = defaultSelectorFactory
} = {}){}
阅读 3.1k
4 个回答

这是es6里面的语法之一。
先了解以下对象的解构赋值。如下:

// 这个应该很好理解了
var { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"

// 然后解构的时候可以指定默认值
var {x = 3} = {};
x // 3

var {x, y = 5} = {x: 1};
x // 1
y // 5

var {x:y = 3} = {};
y // 3

var {x:y = 3} = {x: 5};
y // 5

var { message: msg = 'Something went wrong' } = {};
msg // "Something went wrong"

运行到函数中:

// 参数是一组无次序的值
function f({x, y, z}) {
    console.log(x,y,z) // 3,2,1
}
f({z: 3, y: 2, x: 1});

所以这个函数等同于这样写:

// 这些值是给定的默认值
var connectAdvanced,defaultMapStateToPropsFactories,defaultMapDispatchToPropsFactories,defaultMergePropsFactories,defaultMergePropsFactories,defaultSelectorFactory
function createConnect(params = {}){
    var {
      connectHOC = connectAdvanced,
      mapStateToPropsFactories = defaultMapStateToPropsFactories,
      mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,
      mergePropsFactories = defaultMergePropsFactories,
      selectorFactory = defaultSelectorFactory
    } = params
    
}

ECMAScript 6 入门

先看看这两个吧:
深入浅出ES6 深入浅出ES6

等号后面的是默认值,如果前面的是undefined,那么就用后面的值

let { a, b = 2 } = { a:1 };

console.log(a); // 1
console.log(b); // 2

回复评论:

当然不多余,如果={}省掉了,那么当什么都不传的时候,这个东西就会报错

你试试:

function test({a = 1}){console.log(a)}
test();

function test({a = 1}={}){console.log(a)}
test();

你之前贴的代码等同于这个代码:

function createConnect(obj) {
  if(obj === undefined) obj = {};
  var connectHOC = obj.connectHOC !== undefined ? obj.connectHOC : connectAdvanced,
      mapStateToPropsFactories = obj.mapStateToPropsFactories !== undefined ? obj.mapStateToPropsFactories : defaultMapStateToPropsFactories,
      mapDispatchToPropsFactories = obj.mapDispatchToPropsFactories !== undefined ? obj.mapDispatchToPropsFactories : defaultMapDispatchToPropsFactories;
  // ...mergePropsFactories, selectorFactory
}

函数接受一个object类型的参数 这个参数默认为空对象
如果不为undefined 则 参数的所列属性都有默认值

var obj={
  connectHOC = connectAdvanced,
  mapStateToPropsFactories = defaultMapStateToPropsFactories,
  mapDispatchToPropsFactories = defaultMapDispatchToPropsFactories,
  mergePropsFactories = defaultMergePropsFactories,
  selectorFactory = defaultSelectorFactory
}

function crateConnect(obj={}){
    console.log(obj);
}

这样写你看懂了吧!相当于给object一个默认值,并且把这个对象展开着写成参数了,打死这个写代码的!!!
这个默认值应该不会被执行,因为空对象也会被判断为true,应该不会赋默认值。这句不是很确定,等大神给看看

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题