不能在条件运算符内使用展开

问题描述 投票:0回答:4

假设如下:

const arr = [1, 2, 3];
const insertValues = [-1, 0];
const condition = true;

arr.splice(0, 0, condition ? ...insertValues : insertValues);

这会引发语法错误:

意外的令牌“...”

我可以通过执行以下操作来使其工作:

const arr = [1, 2, 3];
arr.splice(0, 0, ...[-1, 0]);

但这显然不是我想做的。我怎样才能让第一个例子工作?我尝试在我认为必要的地方添加括号,但无济于事。

javascript syntax-error operators spread-syntax
4个回答
4
投票

它可以工作 if

...
是一个运算符,但是 它不是(也不可能是),它是主要语法。操作员不能做
...
所做的事情。运算符必须具有单值结果,但
...
则不然。

因此,您需要传播一个可迭代对象。当您想直接插入它时(条件运算符的假操作数),您可以通过将

insertValues
包装在
[]
中来做到这一点:

arr.splice(0, 0, ...(condition ? insertValues : [insertValues]));
// (Or you could use `unshift` if the index will always be 0 and you're never deleting anything)

(这可能就是您稍后在问题中的意思。如果您想使用某些东西作为一系列可能是或可能不是可迭代的参数,这并不是一个不寻常的习惯用法。)

或者只使用

if
/
else


1
投票

您可以将

...
放在条件运算符之前,无需括号:

const arr = [1, 2, 3];
const insertValues = [-1, 0];
const condition = true;
arr.splice(0, 0, ... condition ? insertValues : [insertValues]);

console.log(arr);

由于

...
是一种语法(语法对表达式的结果进行操作),因此运算符在其之前进行评估,一个更明确的示例:

console.log([... 'a' + 'b']);


1
投票

少数位置允许使用语法。 将您的代码更改为:

const arr = [1, 2, 3];
const insertValues = [-1, 0];
const condition = true;

arr.splice(0, 0, ...(condition ? insertValues : [insertValues]));

或者这个:

if (condition)
  arr.splice(0, 0, ...insertValues);
else
  arr.splice(0, 0, insertValues);

0
投票

如果您不想理会条件,只想让它同时适用于数字和数组,那么这里有一个可能有用的解决方案:

const arr = [1, 2, 3];
const insertValues = [-1, 0];
const condition = true;
arr.splice(0, 0, ...[insertValues].flat());

这是基于意图是

condition ? ...number[] : number

的假设
© www.soinside.com 2019 - 2024. All rights reserved.