美文网首页
js Object对象与深拷贝

js Object对象与深拷贝

作者: 摸摸大海参 | 来源:发表于2019-04-25 15:12 被阅读0次

在JavaScript里,有一句名言:万物皆可对象。
Object是JavaScript基本数据类型之一(function也属于object,是特殊的object),其存储于堆中。

var obj = {}           // 声明空对象
obj.key = 'xxx'        // 添加属性、赋值
var res = obj[key]     // 获取属性值

object以键值的方式存储数据,我们可以把多个同一所属的数据存储到一个对象里,例:

var obj = {
    name: '华为P30 pro',
    price: 5488,
    color: 'black'
}

Object存储特性

JavaScript的数据类型分两种,值类型和引用属性,值类型有String、Number等;Object、Array、Function则是引用类型。
把Object用“等号”赋值给变量,其实是将object所指向的堆中地址赋值给变量,而不是在堆中另开一个空间。

var obj = { name: 'aaa' }
var num = obj
num.name = 'bbb'
alert(obj.name)        // bbb

alert(obj.name) 显示bbb就可以说明了问题了,obj和num指向堆中同一块内存,当obj或num修改键值时,会使得所有指向这块地址的变量在操作时发生同样的变化。

深拷贝

所以,相对于浅拷贝,深拷贝在于开辟新地址,使得变量时不会都受到影响。

function deepCopy (o, c) {                     // o位被拷贝的对象,c为新对象
  var c = c || {}
  for (var i in o) {
    if (typeof o[i] === 'object') {                //要进行深度复制
      if (o[i].constructor === Array) {
        c[i] = []
      } else {
        c[i] = {}
      }
      deepCopy(o[i], c[i])                   //递归调用
    } else {
      c[i] = o[i]
    }
  }
  return c
}

相关文章

网友评论

      本文标题:js Object对象与深拷贝

      本文链接:https://www.haomeiwen.com/subject/yukzgqtx.html