以不同的方式传播和破坏工作,但他们似乎都做了类似的工作。为什么他们不同,为什么不只使用一个?
let foo = [1,2,3];
let [o,t,th] = foo; //destructing works
let [o,t,th] = ...foo; // spreading doesn't work. will not compile
function test (a,b,c) {
console.log(`${a}, ${b}, ${c}`)
}
test(...foo); //works but is sort of destructinng foo into a,b,c
test(foo) //assigns foo to a. b and c are undefined.
答案 0 :(得分:1)
<强>解构强>
let [o,t,th] = [1, 2, 3];
在这里,您要声明三个变量,同时直接从数组元素中为它们分配值。
因此,解构是一种直接访问对象的方法(可以 也是一个数组)属性,无需显式分配它们 变量
相当于:
let o = foo[0];
let t = foo[1];
let th = foo[2];
<强>传播强>
test(...foo);
在这里,您将数组元素传播到逗号分隔的数组元素。
相当于:
test(foo[0], foo[1], foo[2]);
因此这两者是不同的。
答案 1 :(得分:0)
首先,你应该注意
[a, b, c]
和
func(a, b, c)
是完全不同的两件事。当然它们都有逗号和相同的字母,但a, b, c
中的func(a, b, c)
不是数组。
在test(...foo)
中,...foo
将数组内容作为逗号分隔的参数进行传播。这与将数组传递给函数不同。
let [o,t,th] = ...foo;
不起作用,因为规范不允许这样使用。反正它没有意义。你想把foo
的内容传播到什么地方?
然而,这是有道理的:
[...foo] // spread the content into an array
Destructure仅在您将一件事物分配给一堆变量时才有效。例子包括:
let [a, b] = [1, 2];
let {a, b} = {a: 1, b: 2};
function([a, b]){};