JS中把对象赋值给变量时涌现的题目

题目

适才遇到了一个如许的题目:有一个由对象构成的数组,把个中一个对象赋值给变量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}如许一个对象。所以实际上pa指向的是同一个对象,修正其它们中任何一个都会使另一个一同转变。

解决要领

那有没有让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中有深拷贝和浅拷贝如许的辨别,粗粗看了一遍。然则没有更多的实际使用履历所以明白也不是很深入,假如今后有了更深的看法的话到时候再来写一篇。

    原文作者:赤橙酱
    原文地址: https://segmentfault.com/a/1190000008504578
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞