为什么传播和破坏不同,即使他们似乎做了类似的工作

时间:2017-12-08 06:21:42

标签: javascript

以不同的方式传播和破坏工作,但他们似乎都做了类似的工作。为什么他们不同,为什么不只使用一个?

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.

2 个答案:

答案 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]){};