在javascript中多次使用扩展运算符?

在javascript中多次使用扩展运算符?,javascript,ecmascript-6,spread-syntax,Javascript,Ecmascript 6,Spread Syntax,为什么不能多次使用spread运算符 let arr = [[[1, 2, 3]]]; console.log(arr); // Array [ Array[1] ] console.log(...arr); // Array [ Array[3] ] console.log(...(...arr)); // SyntaxError: expected '=>' after argument list, got ')' 我希望: console.log(...(...arr)); //

为什么不能多次使用spread运算符

let arr = [[[1, 2, 3]]];

console.log(arr); // Array [ Array[1] ]
console.log(...arr); // Array [ Array[3] ]
console.log(...(...arr));
// SyntaxError: expected '=>' after argument list, got ')'
我希望:

console.log(...(...arr)); // Array [ 1, 2, 3 ]

因为…arr不像在正常情况下返回值的函数(您可以通过在控制台中键入…[[1,2,3]]来测试这一点,如果…像正常函数一样运行,我们将期望返回[1,2,3]。因此,您无法链接排列。从MDN:

spread运算符允许表达式在不同位置展开 其中有多个参数(用于函数调用)或多个元素 (对于数组文字)应为

因此,扩展需要发生在数组文本、对象文本(如果使用obj扩展,即ES7)或函数调用中 所以您可以执行console.log(…[].concat(…arr))

为什么不能多次使用spread运算符

let arr = [[[1, 2, 3]]];

console.log(arr); // Array [ Array[1] ]
console.log(...arr); // Array [ Array[3] ]
console.log(...(...arr));
// SyntaxError: expected '=>' after argument list, got ')'
..
不是运算符。
(…arr)
不是有效的JavaScript。
..
仅允许在数组文本和参数列表中使用,但这些是语法的特殊形式(请注意下面的生成规则中的
..

根据,扩展语法输入是一个iterable(例如数组),但它产生的输出是不可扩展的(例如非数组)。因此,问题是在外部扩展语法中,
作为输入,你把不可扩展的东西(
…arr
)作为输入,这会导致语法错误。要使数组平坦,你可以使用flat(如果将无穷大改为2,则将展平任何嵌套数组)

让arr=[[1,2,3]];
主控台日志(arr.flat(2));
设arr2=[1,2,3,4,5,6]],[7,8],9]];;

console.log(arr2.flat(Infinity));
不回答您的问题,但是-一般来说,三点
语法可以 可应用于可编辑对象-数组或类似数组的对象

为什么不能多次使用spread运算符

let arr = [[[1, 2, 3]]];

console.log(arr); // Array [ Array[1] ]
console.log(...arr); // Array [ Array[3] ]
console.log(...(...arr));
// SyntaxError: expected '=>' after argument list, got ')'
我不会回答为什么的问题。
但是下面的代码片段显示,
…[].concat(…arr)
实现了您想要的功能 希望通过执行
…(…arr)
获得。 它的灵感来自于

const arr=[[1,2,3]];
console.log(JSON.stringify(arr));//[[1,2,3]]
console.log(JSON.stringify(…arr));//[[1,2,3]]
//console.log(JSON.stringify(…(…arr));//SyntaxError:expect。。。
console.log(JSON.stringify(…[].concat(…arr));/[1,2,3]
console.log(…[].concat(…[].concat(…arr));//1 2 3

.as控制台包装{最大高度:100%!重要;顶部:0;}
..(arr)
有效。根据ES6规范,当遇到扩展运算符时,它与
…arr
相同。从扩展对象创建迭代器,该对象是计算赋值表达式的结果,在您的工作示例
arr
中,例如
…arr
。使用
控制台.log(…(…arr));
您正试图将一个排列运算符+赋值表达式作为赋值表达式传递给另一个排列运算符。请参阅,您可能需要尝试
控制台.log(…[].concat(…arr))
(或任何其他
展平
函数)相关:。我确信传播一个已经传播的数组不会进行计算,但事实证明我错了,因为它确实如此。这似乎是唯一正确的答案+1@madox2:是的,我不知道是谁想出了“排列操作员”这个词但是,它并不是一个JavaScript意义上的操作符。它只是一个令牌。“费利克辛格,你能解释得多一点吗?我已经重复了你的答案很多次,但我不明白。你可能愿意支持我问的问题,以澄清术语“运算符”:@ MADOX2:如果我们认为运算符是一种特殊的函数形式。(在其他语言中是这样的),那么我们可以说,只要我们可以使用函数调用,我们就可以在任何地方使用运算符。例如,代替
var foo=add(1,2);
我们可以编写
var foo=1+2;
。但是,我们不能替换
var foo=spread(arr)
var foo=…arr;
一起使用。没有独立的扩展运算符,它只是数组初始值设定项和参数列表语法的扩展。这在查看语言语法时变得很清楚。
arr.flat(2)