2017-06-22 60 views
0

我有這樣的代碼:原始數組值被修改

let a = {x: "x"}; 
 
let b = {b: "b"}; 
 

 
let versions = [a, b]; 
 
let copyOfVersions = Array.from(versions); 
 
let test = ["test"]; 
 
    
 
copyOfVersions[0].versions = Array.from(test); 
 

 
console.log(versions[0].versions);

怎麼說,versions表中的值也發生了變化?

謝謝!

+3

Array.from不執行深度複製 – juvian

+2

您爲什麼認爲'Array.from' _copies數組中的objects_? – Xufox

+0

當我找到這篇文章時,我使用了'Array.from' [通過JavaScript中的值複製數組](https://stackoverflow.com/questions/7486085/copying-array-by-value-in-javascript)。但即使不執行副本,它也會創建一個新實例。所以我不明白爲什麼原來的價值會發生變化? – Anna

回答

1

是的,你使用Array.from創建了一個新的數組實例。所以版本copyOfVersions是兩個不同的對象,但它們都包含對同一對象的引用列表。所以這意味着當你說copyOfVersions [0]版本[0]你基本上訪問同一個對象a。然後當您使用.versions您正在添加一個新字段。最後,只有對象a已被更改,這就是您看到的打印輸出。

1

ab分別是對象{x: "x"}{b: "b"}的引用。

當您創建新陣列時,這些引用將被複制到新陣列中,但引用的對象不會被複制,它仍然是被引用的原始對象。

copyOfVersions[0]獲取被引用對象,versions[0]引用的同一對象,然後在該對象上創建屬性versions。由於對象本身從未被複制過,因此您正在修改原始對象。

+0

好的,謝謝你的解釋! – Anna