2017-06-22 64 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