2017-09-01 94 views
0

我們有一個具有私有數組的類。分配給變量分片數組允許修改原始數組

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(); 

另外我們有一個實現。

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()); 

我們得到了原始數組的副本。然後我們修改了本地數組(原始數組的副本)。我們得到了修改過的原點數組。

我不明白爲什麼起源專用數組已被修改?

如果我修改getBooks到

getBooks(){ 
    return this.booksList.slice(0); 
    } 

它不會幫助。

如果我修改使用lodash方法_.cloneDeep Method description

getBooks(){ 
    return _.cloneDeep(this.booksList); 
    } 

原始數組將不會被修改getBooks。 爲什麼?如何避免與這種情況有關的錯誤?

+0

可能重複[如何正確克隆JavaScript對象?](https://stackoverflow.com/questions/728360/how-do-i-correctly-clone-a-javascript-object) – kGielo

+0

複製數組不包含其中包含的對象的副本。 – deceze

+0

你在做什麼叫做_shallow copy_。 – undefined

回答

0

當你用slice克隆數組時,裏面的對象保持不變。

如果你有三個對象,a,陣列中的arrbc,你複製它,新的陣列將仍然包含對abc,而不是看起來相同的新對象的引用。

var arr = [ a, b, c ]; 
var arr2 = arr.slice(0); // [ a, b, c ]; 

arr === arr2; // false - they are not the same array 

arr[0] === arr2[0]; // true - they contain the same a object 

這意味着,如果你從arr2得到a,這是相同的a對象,它是在arr - 所以修改一個同時修改。