Javascript 条件扩展元素

Javascript 条件扩展元素,javascript,ecmascript-6,ternary-operator,Javascript,Ecmascript 6,Ternary Operator,当cond为true时,我需要额外信息和用户信息 当cond为false时,只需要userInfo 问题是当cond为false时,我得到 TypeError:(中间值)(中间值)(中间值)[Symbol.iterator]不是函数 我的理解是,我不允许使用布尔值作为扩展元素,在这种情况下,…false 但是…(cond?extraInfo:{})似乎也不起作用 发生了什么事?快去 const cond = false const extraInfo = [ { a: 11,

cond
为true时,我需要额外信息和用户信息

cond
为false时,只需要userInfo

问题是当
cond
为false时,我得到

TypeError:(中间值)(中间值)(中间值)[Symbol.iterator]不是函数

我的理解是,我不允许使用布尔值作为扩展元素,在这种情况下,
…false

但是
…(cond?extraInfo:{})
似乎也不起作用

发生了什么事?

快去

const cond = false

const extraInfo = [
  {
    a: 11,
    b: 25
  },
  {
    a: 12,
    b: 34
  },
  {
    a: 1,
    c: 99
  }
]

const userInfo = [
  {
    z: 8
  },
  {
    z: 10
  },
  ...(cond && extraInfo)
]
真实演示

var cond=true;
变量外部信息=[
{
a:11,
b:25
},
{
a:12,
b:34
},
{
答:1,,
c:99
}
];
var userInfo=[
{
z:8
},
{
z:10
},
…(第二条额外信息:[])
];
console.log(userInfo)另一种方式:

康德是真的:

var extraInfo=[
{
a:11,
b:25
},
{
a:12,
b:34
},
{
答:1,,
c:99
}
]
var cond=真;
var userInfo=[
{
z:8
},
{
z:10
},
…(条件和附加信息| | |[])
]
console.log(userInfo)
让我们检查一下

const extraInfo=[
{
a:11,
b:25
},
{
a:12,
b:34
},
{
答:1,,
c:99
}
];
常量用户信息=[
{
z:8
},
{
z:10
},
];
const cond=假;
让getMyValue=cond?[]concat(extraInfo,userInfo):userInfo;
console.log(getMyValue)
const extraInfo=[
{
a:11,
b:25
},
{
a:12,
b:34
},
{
答:1,,
c:99
}
];
常量用户信息=[
{
z:8
},
{
z:10
},
];
const cond=真;
让getMyValue=cond?[]concat(extraInfo,userInfo):userInfo;

console.log(getMyValue)
有条件地将实体分散到对象

let getMyValue = cond ? [].concat(extraInfo, userInfo) : userInfo;

有条件地将实体分散到数组中

console.log(
  { 
    name: 'Alex',
    age: 19,
    ...(true && { city: 'Kyiv' }),
    ...(false && { country: 'Ukraine' })
  }
) 

// { name: 'Alex', age: 19, city: 'Kyiv' }


可以将条件运算符更改为
…(cond&&extraInfo | | |[])
Nice,但是为什么呢!?如果它接受填充的对象,为什么不空一个呢?现在它有意义了!因此,如果没有[Symbol.iterator]协议,对象是不可移植的,这就是为什么
..{}
不起作用的原因?@AswinRamesh这也起作用,谢谢,我也会添加它。@AswinRamesh不,不要这样做。它更长,更容易混淆,并且只有在
extraInfo
是真实的情况下才有效。为什么不使用适当的三元运算符呢?品味问题。正确性、简单性和性能问题。当然,您可能会对它们有一种可怕的感觉:-)您确定三元运算符的性能更好吗?如果您不能理解它,这并不意味着它是正确的,因为它不必计算
cond&&extraInfo
表达式返回的值的真实性。这是一次手术,不是两次。(同时:写下你的意思)虽然这可以从理论上回答问题,但在这里包括答案的基本部分,并提供链接供参考。嗨,我把我的ans放在这一节的底部,没有问题让我们检查一下。那么,扩散到对象和数组之间的实际区别是什么?当尝试扩展到数组中时,会得到
未捕获的TypeError:boolean false不可编辑(无法读取属性符号(Symbol.iterator))
。我不知道这可以做到。在某些用例中非常简洁。美好的
console.log(
  { 
    name: 'Alex',
    age: 19,
    ...(true && { city: 'Kyiv' }),
    ...(false && { country: 'Ukraine' })
  }
) 

// { name: 'Alex', age: 19, city: 'Kyiv' }


console.log(
  [
    'Dan',
    'Alex',
    ...(true ? ['Robin'] : [])
  ]
)

// [ 'Dan', 'Alex', 'Robin' ]