题目
适才遇到了一个如许的题目:有一个由对象构成的数组,把个中一个对象赋值给变量p
,然后转变了p
的属性,对应的本来数组中的对象的属性也会随之转变。
var arr = [{x:0, y:0}, {x:0, y:0}]
var p = arr[0]
p.x = 1
p.y = 2
console.log(arr) // [{x:1, y:2}, {x:0, y:0}]
探讨
我一开始认为这是数组的什么奇异特征,经由几番实验发明只要由对象构成的数组有这个题目,隐约以为这是对象的某个特征,然后又试了下,果然如此!
var a = {x:0, y:0}
var p = a
p.x = 1
console.log(a) // {x:1, y:0}
把a
赋值给变量p
今后,转变p
的某个属性,a
中对应的属性也会随之转变。
缘由
简朴地想了一下缘由,不知道准确不准确:var p = a
是让p
指向了a
所代表的对象。同理,var a = {x:0, y:0}
是让a
指向了{x:0, y:0}
如许一个对象。所以实际上p
和a
指向的是同一个对象,修正其它们中任何一个都会使另一个一同转变。
解决要领
那有没有让p
转变今后a
坚持稳定的要领呢?
有的!
var a = {x:0, y:0}
var p = {}
p.x = a.x
p.y = a.y
经由过程这类体式格局把a
的属性一一对应地赋值给p
,今后对p
做出的任何修正都不会影响到a
。然则这类要领很贫苦,特别是遇到属性许多的对象,那末能够写个函数来完成这个事情:
function cloneObj(obj) {
var newObj = {}
for(var prop in obj) {
newObj[prop] = obj[prop]
}
return newObj
}
var a = {x:0}
var p = cloneObj(a)
p.x = 2
console.log(p) // {x:2}
console.log(a) // {x:0}
胜利了!修正p
的属性今后a
的属性没有随之转变。
厥后网上查了查,发明js中有深拷贝和浅拷贝如许的辨别,粗粗看了一遍。然则没有更多的实际使用履历所以明白也不是很深入,假如今后有了更深的看法的话到时候再来写一篇。