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' ]