87,997
社区成员




<script>
var obj = {
id: 1,
name: 'haha',
ob: {
id: 23
}
}
var o = {}
for (var k in obj) {
// obj[k]表示属性值,k表示属性名
// o[k]表示什么,也是表示属性值?那是如何进行拷贝的呢?
o[k] = obj[k];
}
o.id = 5;
o.ob = {
id: 66
}
console.log(o)
console.log(obj)
o.ob = { id: 66 }
o.ob.id = 66;
o.ob = {
id: 66
}
o.ob.id = 66;
以上两种方式都是修改了o对象中的相关属性值,但是只是第二种方式能同步更改obj里面的数据,而第一种却不行,同样都是修改了id为何就会不一样呢,能否从更深的角度去解释一下,听您这样解释还是不太明白。另外,您说的浅拷贝是切断了第一层的引用关系,是否能理解成或者换句话说浅拷贝是完全复制简单数据类型的内存空间,而复杂数据类型只是复制内存空间的地址。
o.id = 5;
o.ob = {
id: 66
}
o.ob.id=88
console.log(o)
console.log(obj)
不过,像上面这样,你如果先操作o.ob={id:66},然后再o.ob.id=任意值,这个时候对obj是没有影响的。o.ob={id:66}重新赋值,它就已经和obj中的ob没有任何关系了,只是大家属性名称一样而已。这个就好比说,你直接定义o={ id: 1, name: 'haha', ob: { id: 23 } }。虽然它看着和obj一模一样。但很明显,你马上就知道它是一个新对象,和obj是没有关系的
o = obj
o = { id: 1, name: 'haha', ob: { id: 23 } }
o.ob.id = 98
就好比这样,如果没有中间那句对o的重新赋值定义。下面的o.ob.id是会影响到obj的。但加上中间那句,你怎么改都和obj没毛线关系了 o.ob = {
id: 66
}
这一步你给ob赋值了一个新对象啊,虽然和原来的长的一样,但它是一个新的对象