Javascript ES6未定义的属性值缩写 我想使用属性值速记,但是只有在定义值时,考虑下面的例子: const personByName = name => { const person = http(name) return { person, method: 'byName' } } personByName('john') // found person: { person: { name: 'john', age: 30 }, method: 'byName' } personByName('paul') // not found: { method: 'byName' }

Javascript ES6未定义的属性值缩写 我想使用属性值速记,但是只有在定义值时,考虑下面的例子: const personByName = name => { const person = http(name) return { person, method: 'byName' } } personByName('john') // found person: { person: { name: 'john', age: 30 }, method: 'byName' } personByName('paul') // not found: { method: 'byName' },javascript,ecmascript-6,Javascript,Ecmascript 6,但我得到的电流输出是: personByName('paul') // not found: { person: undefined, method: 'byName' } 我想你想要这样的东西: const personByName = name => { const person = http(name); const result = { method: 'byName' }; if (person) { result.person = person; } retu

但我得到的电流输出是:

personByName('paul') // not found: { person: undefined, method: 'byName' }

我想你想要这样的东西:

const personByName = name => {
  const person = http(name);
  const result = { method: 'byName' };
  if (person) { result.person = person; }
  return result;
}
如果对象的
未定义

则不能跳过在对象上声明属性。要使用速记属性,可以使用
对象。分配

const personByName = name => {
  const person = http(name);
  return Object.assign({ method: 'byName' }, person && { person });
}
后续的非object
object.assign
参数被有效忽略,因此falsy
person
不会影响结果

如果预期
person
是一个对象,这将起作用,如原始代码中所示

如果只允许未定义的值,则为:

Object.assign({ method: 'byName' }, person !== undefined && { person });

在ES2018中,如果定义了
a
并扩展了对象,则可以使用三元运算符来计算,以构建包含
a
b
的对象,或者仅计算
b

常数a=1
常数b={b:2}
常数c=a?{a,…b}:b

console.log(c)
在ES2018中,即使不进行“类型检查”,也可以执行此操作

设a={a:1}
设b={b:2}
设c=未定义
设d={d:4}
设x={…a,…b,…c,…d};//{a:1,b:2,d:4}
//                      ┗━━ 未定义

console.log(x)
您确定不想
http.get(name)
?为什么要这样做?@Naramsim
http
是一种方法,在本例中,它只是作为一个示例添加到这里。。。我可以称之为
foo
bar
,但这种方式看起来是真实的:)人有什么问题?这正是
未定义
值的作用所在。始终使用具有相同属性的对象也更有效。@Bergi我认为这是一个不同的主题,我有一个具体的问题,并试图用一个具体而简短的例子来简化我的问题。在一般情况下,我确实同意你的观点,但在我的具体情况下,如果值未定义,则省略键是有意义的。虽然它有效,但我试图找到一种方法来避免
结果的额外步骤条件+突变
。。。我想你是对的,没有办法跳过一个未定义的属性。我不明白为什么向下投票:/如果向下投票人可以添加一条评论就好了。应该注意的是,它是ES2018,而不是ES6。@estus fixed;-)@FelixKling顺便问一句,您如何参考
?对象属性扩展?我认为提案使用了“对象扩展”和“对象剩余”这两个术语。但是“传播/休息属性”也很好。聪明!我想不出要在那里添加条件。。。唾手可得地