Nous avons une classe qui possède un tableau privé.L'affectation à un tableau à tranches variables permet de modifier le tableau d'origine
class BookService{
private booksList: Book[];
constructor(){
this.booksList = [
new Book('Tales', true),
new Book('Novels', false),
new Book('Dictionary', false)
];
}
getBooks(){
return this.booksList;
}
}
class Book{
constructor (public name: string, public isRead: boolean){}
}
export const bookService = new BookService();
Nous avons également une implémentation.
import {bookService} from './book-service';
//get copy of original array which is not by reference
let books: any = bookService.getBooks().slice(0);
//log local array
console.log(books);
// modify local array
books[1].isRead = true;
//log original array
console.log(bookService.getBooks());
Nous avons obtenu la copie du tableau d'origine. Puis nous avons modifié le tableau local (copie du tableau d'origine). Nous avons un tableau d'origine qui a été modifié.
Je n'arrive pas à comprendre pourquoi la matrice privée d'origine a été modifiée?
Si je modifie getBooks à
getBooks(){
return this.booksList.slice(0);
}
il ne sera pas utile.
Si je modifie getBooks en utilisant la méthode lodash _.cloneDeep Method description
getBooks(){
return _.cloneDeep(this.booksList);
}
le tableau original ne sera pas modifié. Pourquoi? Comment éviter les erreurs liées à ce genre de situations?
Copie possible de [Comment est-ce que je clone correctement un objet JavaScript?] (Https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object) – kGielo
Copie du tableau ne fait pas une copie des objets qu'il contient. – deceze
Ce que vous faites est appelé _shallow copy_. – undefined