为什么我数组中的原始项目被 Object.assign 覆盖?

Why is the original item in my array being overwritten with Object.assign?

我有一个单元测试产生了我没想到的东西:

背景:我正在使用 Angular/test 驱动开发制作一个简单的待办事项列表。

问题:当我对数组中的项目调用 editTask 时,它更改了项目的值。但是,我看不到它在原始数组中是如何改变的,因为在我正在测试的方法中从未访问过原始数组。请帮助我连接如何更改原始数组?看起来 Object.assign 正在这样做,但为什么?

 describe('editTask', () => {
    it('should update the task by id', () => {
      const dummyTask1 = { id: 1, name: 'test', status: false };
      service.tasks.push(dummyTask1); //refers to TestBed.get(TaskService)
      const id = 1;
      const values = { name: 'cat', status: false };

      service.editTask(id, values);
      console.log(service.tasks); // why does this log this object? [Object{id: 1, name: 'cat', status: false}]
      expect(service.tasks[0].name).toEqual(values.name); // Test passes
    });
  });

这是我正在测试的方法:

  editTask(id, values) {
    const task = this.getTask(id);

    if (!task) {
      return;
    }

    Object.assign(task, values); //How does this line change the array?

    return task;
  }

  getTask(id: number) {
    return this.tasks.filter(task => task.id === id).pop(); //is this altering the original array somehow?
  }

如果需要,这里是完整的 Angular 服务:

export class TaskService {
  tasks: any = [];
  lastId = 0;

  constructor() { }

  addTask(task) {
    if (!task.id) {
      task.id = this.lastId + 1;
    }

    this.tasks.push(task);
  }

  editTask(id, values) {
    const task = this.getTask(id);

    if (!task) {
      return;
    }

    Object.assign(task, values);

    return task;
  }

  deleteTask(id: number) {
    this.tasks = this.tasks.filter(task => task.id !== id);
  }

  toggleStatus(task) {
    const updatedTask = this.editTask(task.id, { status: !task.status});

    return updatedTask;
  }

  getTasks() {
    return of(this.tasks);
  }

  getTask(id: number) {
    return this.tasks.filter(task => task.id === id).pop();
  }
}

这是 github 存储库:https://github.com/capozzic1/todo-tdd

getTask() 方法正在使用数组 filter() 方法获取对数组中项目的引用。

然后它使用 Object.assign() 来更改项目的属性。 Object.assign() 方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。它将 return 目标对象。

所以现在项目内存中的引用值已更改。因为它是内存中的引用,所以您会看到原始项目正在更改。