Javascript对象分解和默认参数的组合

Javascript对象分解和默认参数的组合,javascript,ecmascript-6,Javascript,Ecmascript 6,今天我遇到了以下我不认识的语法: const createUser=({ 年龄=1岁, 名称='匿名', }) => ({ 年龄, 名称 }); const defaultP=createUser({ 年龄:5 }); console.log(defaultP),该语法确实用于从参数对象提取默认值。中有一些例子可以帮助我们理解技巧,请查看以下内容: var {a = 10, b = 5} = {a: 3}; console.log(a); // 3 console.log(b); // 5

今天我遇到了以下我不认识的语法:

const createUser=({
年龄=1岁,
名称='匿名',
}) => ({
年龄,
名称
});
const defaultP=createUser({
年龄:5
});
console.log(defaultP),该语法确实用于从参数对象提取默认值。中有一些例子可以帮助我们理解技巧,请查看以下内容:

var {a = 10, b = 5} = {a: 3};
console.log(a); // 3
console.log(b); // 5
示例的一个可能缺点是
createUser
方法忽略参数对象的所有其他值,并且始终返回一个仅包含
age
name
的对象。如果您想使其更灵活,我们可以像这样使用
Object.assign()

const createUser = (o) => Object.assign({ age: 1, name: 'Anonymous' }, o);
function createUser(params) {
  return {
    age: typeof params.age === 'undefined' ? 1 : params.age,
    name: typeof params.name === 'undefined' ? 'Anonymous' : params.name,
  };
}
在这种情况下,用户创建的对象将合并参数对象和默认值。现在请注意,默认值在方法体中。使用此方法,我们可以创建包含其他属性的用户,例如:

const superman = createUser({ name: 'Superman', type: 'superhero' });
console.log(superman);
// output: {age: 1, name: "Superman", type: "Superhero"}

如果您使用babel并将代码传输到ES5,它将如下所示:

const createUser = (o) => Object.assign({ age: 1, name: 'Anonymous' }, o);
function createUser(params) {
  return {
    age: typeof params.age === 'undefined' ? 1 : params.age,
    name: typeof params.name === 'undefined' ? 'Anonymous' : params.name,
  };
}

请注意:函数参数的默认值的工作方式相同:

const multiply = (a, optionalB) => {
  const b = typeof optionalB !== 'undefined' ? optionalB : 2;
  return a * b;
}
同:

const multiply = (a, b = 2) => {
  return a * b;
}

它增加了可读性,主要是在多次使用参数的情况下。

您的代码同时使用了
对象解构
默认函数道具

const createUser = ({
  age = 1,
  name = 'Anonymous',
}) => ({
  age,
  name,
});
这里的函数
createUser
接受类型为
Object
的单个参数。函数正在返回同一个对象,如果在参数中定义了两个对象属性,则它将返回传递的对象。否则,它将用默认值替换它,分别是
1
Anonymous

您可以在此处进一步了解:


这些只是已分解属性的默认值。与
(x=1)=>{}
的工作方式相同,只是嵌套在另一个对象中:
({a=1})=>{}
。好的,在仔细研究并问了这个问题之后,我想我现在明白了,但一开始它看起来很奇怪,也许你可以看看这里:[对象属性分配模式[YDKJS:ES6&Beyond]()