假设如下:
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]);
但这显然不是我想做的。我怎样才能让第一个例子工作?我尝试在我认为必要的地方添加括号,但无济于事。
它可以工作 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
。
您可以将
...
放在条件运算符之前,无需括号:
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']);
如果您不想理会条件,只想让它同时适用于数字和数组,那么这里有一个可能有用的解决方案:
const arr = [1, 2, 3];
const insertValues = [-1, 0];
const condition = true;
arr.splice(0, 0, ...[insertValues].flat());
这是基于意图是
condition ? ...number[] : number
的假设