从 angular 中的服务函数返回后,组件的复杂服务对象发生变化

Complex object of Service changes from component after returning from service function in angular 5

进一步阐述我的问题,

我有一个名为 hero.service.ts 的服务正在一个名为 hero.component.ts 的组件中使用。 hero.service.ts 包含一个变量 heros,它是一个 array 并包含许多项。

我正在通过一个名为 getHeroes() 的函数从 hero.service.ts 获取 heros 的值,其中 returns 变量为 return this.heros; 并获取组件上的值通过 this.heros = this.heroService.getHeroes().

在我的组件中,英雄列表在 table 中。 当我从 table 中删除行时,它实际上也会从 hero.service.ts 的变量 heros 中删除。

仅供参考,我通过返回 heros... 扩展运算符(如 return [...this.heros];)来实现它。但是为什么服务传递变量的引用。请大家帮忙。

在 JavaScript 中,数组和对象等复杂数据类型通过引用传递,而不是通过值传递。

当您从您的服务返回 this.heros; 时,您的组件没有获得 heroes 数组。它得到了内存中英雄数组的引用。

基本上在这一点上,组件和服务中的 heroes 属性都指向内存中的同一个数组。

为了在您 return [...this.heros]; 时修复此问题,这次它将 heroes 数组的元素分散到一个动态创建的新数组中,然后将对该新创建的数组的引用返回给您组件。

那个时候,组件 heroes 指向内存中的另一个数组。因此,当您这样做时,您会得到预期的结果,即英雄从组件数组中删除,而不是从服务数组中删除。

这里有一个 StackBlitz 供您参考。